我的情况比较复杂。这与在键盘上方移动视图有关。我有一个聊天视图,就像一个Apple的Messages应用程序一样。但是,它位于不能填充整个屏幕的卡内。该卡的上方和下方是导航栏和标签栏。
现在,我想在点击时将可编辑的UITextView(用户编写消息的位置)移动到键盘上方。我确实有键盘的高度(使用NotificationCenter Observer),但是我需要从键盘的高度中将其从textview的高度(卡内)中减去,以计算应该偏移textview的距离。图片可能会有所帮助:
这是我的视图堆栈: 视图->卡视图-> ScrollView(包含消息列表表视图和聊天表视图)-> TextBox视图(包含UITextView,发送按钮等)
这可行吗?有更好的方法吗?我很困惑,并且在处理有关键盘的视图方面还很新。
这是我到目前为止拥有的代码片段:
fileprivate var keyboardHeight = CGFloat()
@objc fileprivate func keyboardWillShow(notification: NSNotification) {
if let keyboardSize = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
let keyboardHeight = keyboardSize.height
self.keyboardHeight = keyboardHeight
}
}
fileprivate func moveTextView(textView: UITextView, moveDistance: Int, up: Bool) {
let moveDuration = 0.3
let movement = CGFloat(up ? moveDistance : -moveDistance)
UIView.animate(withDuration: moveDuration) {
self.snp.updateConstraints({ (make) in
make.bottom.equalToSuperview().offset(movement)
})
self.superview?.layoutIfNeeded()
}
}
extension TextBarView: UITextViewDelegate {
func textViewDidBeginEditing(_ textView: UITextView) {
moveTextView(textView: textView, moveDistance: -200, up: true)
}
func textViewDidEndEditing(_ textView: UITextView) {
moveTextView(textView: textView, moveDistance: -200, up: false)
}
func textViewShouldEndEditing(_ textView: UITextView) -> Bool {
textView.resignFirstResponder()
return true
}
}
我正在使用SnapKit进行自动布局。
(如果您阅读了整篇文章,谢谢!)