键盘交互关闭时,UITableView contentInset不更新

Pau*_*aul 5 keyboard scroll uitableview uiscrollview ios

更新资料

我发现在许多重构中,我继承自UIViewController而不是UITableViewController,因此我缺少UITableViewController提供的一些自动行为。但是,在交互式关闭键盘时,我仍然需要手动处理滚动视图插图。看到我更新的答案。


我正在尝试模拟iMessage,当用户将其拖到屏幕底部时如何关闭键盘。我可以解决一个困扰我的小视觉问题。

当将键盘从屏幕上拖动时,滚动指示器无法正确调整大小-直到完全将其关闭为止。

我使用键盘通知来告诉我何时出现键盘以增加内容并按键盘高度滚动插图。取消键盘后,似乎不需要执行任何操作,因为插入时似乎正确。但是,以交互方式关闭时,在拖动事件期间我无法更新插图。

为了说明问题,第一个图像显示由于键盘占用了空间,因此内容已滚动到屏幕顶部之外。用户已滚动到表格的最后一行:

显示键盘,内容滚动到底部

在这里,键盘被关闭了,几乎完全不在屏幕上。但是,请注意滚动指示器的尺寸完全错误。现在所有内容几乎都在屏幕上,因此指示器应该伸展,但是,发生的情况是,当键盘向下移动时,滚动指示器向上移动而不伸展。这不是iMessage中发生的情况。

键盘被解雇

我认为我的工作很标准,我正在创建UIToolBar(iOS 8.3)并在我的视图控制器中覆盖以下方法:

override var inputAccessoryView: UIView {
    return toolbar
}

override func canBecomeFirstResponder() -> Bool {
    return true
}

func willShowKeyboard(notification: NSNotification) {
    let keyboardFrame = notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue
    tableView.contentInset.bottom = keyboardFrame.CGRectValue().height
    tableView.scrollIndicatorInsets.bottom = keyboardFrame.CGRectValue().height
}
Run Code Online (Sandbox Code Playgroud)

Pau*_*aul 2

更新

切换到 a 后UITableViewController,我发现这种实现scrollViewDidScroll()(以及下面原始解决方案中的其他方法)实现了当键盘交互式关闭时动态调整插图大小的技巧。

override func scrollViewDidScroll(scrollView: UIScrollView) {

    if !keyboardShowing {
        return
    }

    let toolbarFrame = toolbar.convertRect(toolbar.frame, toView: nil)

    tableView.scrollIndicatorInsets.bottom = view.bounds.height - toolbarFrame.minY
    tableView.contentInset.bottom = view.bounds.height - toolbarFrame.minY
}
Run Code Online (Sandbox Code Playgroud)

我已经达到了同样的效果。我不确定这是否是正确的方法,但效果很好。我有兴趣知道可能还有哪些其他解决方案。

func didShowKeyboard(notification: NSNotification) {
    let keyboardFrame = notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue
    let keyboardHeight = keyboardFrame.CGRectValue().height

    tableView.contentInset.bottom = keyboardHeight
    tableView.scrollIndicatorInsets.bottom = keyboardHeight

    keyboardShowing = true
}

func didHideKeyboard(notification: NSNotification) {
    keyboardShowing = false
}

func scrollViewDidScroll(scrollView: UIScrollView) {

    if !keyboardShowing {
        return
    }

    let toolbarFrame = view.convertRect(toolbar.frame, fromView: toolbar)

    tableView.scrollIndicatorInsets.bottom = view.bounds.height - toolbarFrame.minY
    tableView.contentInset.bottom = view.bounds.height - toolbarFrame.minY
}
Run Code Online (Sandbox Code Playgroud)