在 iOS11 键盘后面扩展 UIScrollView 插图

Posted

技术标签:

【中文标题】在 iOS11 键盘后面扩展 UIScrollView 插图【英文标题】:Extend UIScrollView insets behind keyboard on iOS11 【发布时间】:2017-10-03 15:08:32 【问题描述】:

自从 Apple 推出 safe area insetsadjusted content insets 以来,已经工作的 UI 布局代码被破坏了。在我的情况下,当键盘出现时 UIScrollView 底部插图会扩展:

func keyboardWillResize(_ notification: Notification) 
    let info: [AnyHashable: Any] = notification.userInfo!
    let keyboardTop = self.view.frameOnScreen.maxY - (info[UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue.y
    UIView.animate(withDuration: 0.3, animations: 
        self.tableView.contentInset.bottom = keyboardTop
        self.tableView.scrollIndicatorInsets = self.tableView.contentInset
    )

ios 11 中,此代码在键盘出现时产生额外的插入,等于标签栏的高度。这很明显,因为现在contentInset 只表示用户定义的 insets,而真正的 insets 由 iOS 11 中引入的adjustedContentInset 表示。

所以我的问题是如何以良好的方式处理这种情况?可以选择写

self.tableView.contentInset.bottom = keyboardTop - self.tableView.adjustedContentInset.bottom

但它看起来很丑。也许有内置的方法来扩展键盘后面的插图?

【问题讨论】:

【参考方案1】:

显然,答案在官方文档中。我们应该将这些东西委托给视图控制器并处理它的安全区域插入,而不是手动调整内容插入。所以,这里是工作代码:

func keyboardWillResize(_ notification: Notification) 
    let info: [AnyHashable: Any] = notification.userInfo!
    let keyboardTop = self.view.frameOnScreen.maxY - (info[UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue.y
    UIView.animate(withDuration: 0.3, animations: 
        self.additionalSafeAreaInsets.bottom = max(keyboardTop - self.view.safeAreaInsets.bottom, 0)
    )

【讨论】:

以上是关于在 iOS11 键盘后面扩展 UIScrollView 插图的主要内容,如果未能解决你的问题,请参考以下文章

在带有 ios 键盘扩展的设备上运行 Xcode Instruments

iOS 8 键盘扩展:出现呼叫栏时出现约束错误?

iOS - 隐藏在键盘后面的 UIView 容器

带有 UITextView 的 iOS 7 UITableViewCell 隐藏在键盘后面

在自定义键盘扩展中播放标准 iOS 键盘点击声音

iOS 8 自定义键盘