1. 程式人生 > >iOS 關於自定義表情鍵盤

iOS 關於自定義表情鍵盤

輸入框(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
    }
  • 表情載入