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
    }
  • 表情加载

猜你喜欢

转载自www.cnblogs.com/qqcc1388/p/10135284.html
今日推荐