iOS 關於自定義表情鍵盤
阿新 • • 發佈:2018-12-18
輸入框(UITextView)
- 為了讓輸入框能夠隨著使用者輸入內容變化自動變化高度,這裡的輸入框使用UITextView來實現,監聽textView的代理,當輸入內容發生改變的時候計算當前輸入的寬高,給予textView一個最小高度一個最大高度,當高度超過最大高度時,讓textView滾動起來
//驗證文字高度 func textHeight() -> CGFloat{ let rect = textView.attributedText.boundingRect(with: CGSize(width: textView.bounds.size.width - textView.textContainer.lineFragmentPadding*2, height: CGFloat.greatestFiniteMagnitude) , options: .usesLineFragmentOrigin, context: nil) return rect.height + textView.textContainerInset.top*2 } //監聽輸入 func textViewDidChange(_ textView: UITextView) { //內容改變 計算文字高度 同時更新鍵盤的高度 let height = textHeight() if textHeight() <= keyBoardMaxheight { textView.isScrollEnabled = false }else{ textView.isScrollEnabled = true } print(height) if height != last { last = height textView.setNeedsUpdateConstraints() if textView.isScrollEnabled{ textView.scrollRangeToVisible(NSRange(location: textView.attributedText.length, length: 1)) } } }
- 監聽textView鍵盤的彈起和落下,從而控制輸入框彈起和落下
NotificationCenter.default.addObserver(self, selector: #selector(keyBoardWillShow(_:)), name: UIResponder.keyboardWillShowNotification , object: nil) NotificationCenter.default.addObserver(self, selector: #selector(keyBoardWillHide(_:)), name: UIResponder.keyboardWillHideNotification , object: nil) //MARK:- 鍵盤彈起 @objc func keyBoardWillShow(_ noti: Notification){ let info = noti.userInfo let rect = (info?[UIResponder.keyboardFrameEndUserInfoKey] as! NSValue).cgRectValue //鍵盤偏移量 let changeY = rect.size.height //鍵盤彈出的時間 let duration = info?[UIResponder.keyboardAnimationDurationUserInfoKey] as! Double UIView.animate(withDuration: duration) { self.transform = CGAffineTransform(translationX: 0, y: -changeY) } if !emojiBtn.isSelected{ //鍵盤升起來的時候讓emojiView彈下去 UIView.animate(withDuration: duration) { self.emojiView.transform = CGAffineTransform(translationX: 0, y: changeY) } } } //MARK:- 鍵盤落下 @objc func keyBoardWillHide(_ noti: Notification){ let info = noti.userInfo //鍵盤彈出的時間 let duration = info?[UIResponder.keyboardAnimationDurationUserInfoKey] as! Double UIView.animate(withDuration: duration) { self.transform = CGAffineTransform.identity } if emojiBtn.isSelected{ UIView.animate(withDuration: duration) { self.transform = CGAffineTransform(translationX: 0, y: -self.emojiViewHeight) self.emojiView.transform = CGAffineTransform.identity } } }
- 鍵盤切換,通過表情鍵盤按鈕切換表情鍵盤,需要注意的時候切換鍵盤之前先把resignFirstResponder,當處於表情鍵盤時,如果使用者點選了輸入框,也需要把鍵盤切換到預設鍵盤模式
@objc func keyboardExchange(_ btn: UIButton){ btn.isSelected = !btn.isSelected //鍵盤切換 if textView.isFirstResponder{ textView.resignFirstResponder() } if btn.isSelected { //表情鍵盤 }else{ //自定義鍵盤 textView.becomeFirstResponder() } } func textViewShouldBeginEditing(_ textView: UITextView) -> Bool { if emojiBtn.isSelected { emojiBtn.isSelected = true keyboardExchange(emojiBtn) } return true }
- 表情載入