键盘交互式解除时,UITableView contentInset不会更新

时间:2015-04-11 23:23:02

标签: ios uitableview scroll uiscrollview keyboard

更新

我发现在我的许多重构中,我继承自UIViewController而不是UITableViewController,所以我错过了UITableViewController提供的一些自动行为。但是,当交互式解除键盘时,我仍然需要手动处理滚动视图插图。请参阅我更新的答案。


我试图模仿iMessage,当用户将键盘拖到屏幕底部时键盘被解除。我让它处理了一个让我烦恼的小视觉问题。

当键盘被拖离屏幕时,滚动指示器无法正确调整大小 - 直到它完全被解除。

我使用键盘通知告诉我键盘何时出现增加内容并按键盘高度滚动插入内容。当键盘被解除时,似乎我不需要做任何事情,因为插件似乎是正确的。但是,当以交互方式解除时,我无法在拖动事件期间更新插入内容。

为了说明这个问题,第一张图片显示由于键盘占用空间,内容已从屏幕顶部滚动;用户已滚动到表格的最后一行:

Keyboard displayed, content scrolled to bottom

在这里,键盘正在被解雇,几乎完全不在屏幕上。但请注意滚动指示器的大小是否完全错误。所有内容现在几乎都在屏幕上,因此指示器应该拉伸,但是,当键盘向下移动时,滚动指示器向上移动并且不伸展。这不是iMessage中发生的事情。

Keyboard being dismissed

我认为我正在做的非常标准,我正在创建一个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
}

1 个答案:

答案 0 :(得分:0)

更新

切换到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
}

我设法达到了同样的效果。我不确定这是否是正确的方法,但它运行良好。我很想知道可能有哪些其他解决方案。

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
}