【问题标题】:UITableView contentInset not updating when keyboard interactively dismissed交互关闭键盘时 UITableView contentInset 不更新
【发布时间】:2015-06-17 12:23:43
【问题描述】:

更新

我发现在我的许多重构中,我从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
}

【问题讨论】:

  • 顺便说一句,iMessages 应用程序不使用 tableview,我认为它使用的是 collectionView
  • 真的吗?感谢您的信息,我将不得不调查...
  • 如果您只是想实现交互式关闭键盘,您知道 TableView 属性检查器窗口中的键盘有“交互式关闭”选项,对吧?
  • 我推荐这个链接查看答案Continue to link

标签: ios uitableview scroll uiscrollview keyboard


【解决方案1】:

更新

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

【讨论】:

  • 很好的解决方案!
猜你喜欢
  • 2018-09-09
  • 1970-01-01
  • 1970-01-01
  • 2016-01-26
  • 2020-04-18
  • 2010-12-06
  • 2020-04-04
  • 2011-07-17
  • 1970-01-01
相关资源
最近更新 更多