滚动表格时如何将inputView移动到键盘上方

Mus*_*tri 7 keyboard ios swift

我有一个视图控制器,其中有表格视图和表格下方的 textView

当我点击 textView 时,键盘出现,当我点击 textView 外部时,键盘消失 这工作正常,但我有一个问题,即当我拖动(向下滚动)表格视图时,textView 不会随键盘向下移动,并且我在键盘后面看到黑色背景,如下图所示

键盘随着文本视图消失

如何在 Swift 中解决这个问题

更新: 这是我当前观察 keyboardFrameChanges 的代码

func keyboardFrameChanged(notification: NSNotification) {

    let dict = NSDictionary(dictionary: notification.userInfo!)
    let keyboardValue = dict.objectForKey(UIKeyboardFrameEndUserInfoKey) as! NSValue
    let bottomDistance = mainScreenSize().height - keyboardValue.CGRectValue().origin.y
     let duration = Double(dict.objectForKey(UIKeyboardAnimationDurationUserInfoKey) as! NSNumber)

    UIView.animateWithDuration(duration, animations: {
        self.inputViewConstraint!.constant = -bottomDistance
        self.view.layoutIfNeeded()
        }, completion: {
            (value: Bool) in
            self.chatTableView.scrollToBottom(animation: true)
    })

}
Run Code Online (Sandbox Code Playgroud)

更新 2: 我通过将 keyboardDismissMode 从Interactive更改为OnDrag找到了解决方案

chatTableView.keyboardDismissMode = UIScrollViewKeyboardDismissMode.OnDrag
Run Code Online (Sandbox Code Playgroud)

一旦观察到表格中的任何拖动移动,这将立即将键盘和 textView 向下移动,但是如何在交互模式下执行此操作,例如在 whatsapp 聊天视图中

flo*_*_23 -1

您可以使用观察键盘的框架NSNotificationCenter并创建一个在框架更改时调用的方法。在这种方法中,您可以获得键盘的坐标,并可以inputView相应地重新定位。

override func viewDidLoad() {
    super.viewDidLoad()

    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ViewController.keyboardDidChangeFrame(_:)), name: UIKeyboardWillChangeFrameNotification, object: nil)
}

func keyboardDidChangeFrame(notification: NSNotification) {
    let keyboardScreenFrameEnd = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as! NSValue).CGRectValue()
    let keyboardViewFrameEnd = view.convertRect(keyboardScreenEndFrame, fromView: view.window)

    let keyboardHeight = keyboardViewFrameEnd.height

    // calculate the offset of your inputView
    inputView.frame = CGRectOffset(inputView?.frame, ..., ...)
}
Run Code Online (Sandbox Code Playgroud)