输入框(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
}
- 表情加载