从屏幕底部到卡片视图内部的视图高度? (打开时在键盘上方移动视图)

时间:2018-09-12 17:33:25

标签: ios swift uiview keyboard snapkit

我的情况比较复杂。这与在键盘上方移动视图有关。我有一个聊天视图,就像一个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进行自动布局。

(如果您阅读了整篇文章,谢谢!)

0 个答案:

没有答案