Swift 在iOS11上扩展键盘后面的UIScrollView插图

Swift 在iOS11上扩展键盘后面的UIScrollView插图,swift,uiscrollview,ios11,Swift,Uiscrollview,Ios11,自从苹果公司推出了安全区域插页和调整内容插页以来,已经在运行的UI布局代码就被破坏了。在我的例子中,当键盘出现时,UIScrollView底部插入会扩展: func keyboardWillResize(_ notification: Notification) { let info: [AnyHashable: Any] = notification.userInfo! let keyboardTop = self.view.frameOnScreen.maxY - (info

自从苹果公司推出了
安全区域插页
调整内容插页
以来,已经在运行的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
只表示用户定义的插入,而真正的插入由iOS 11中引入的
adjustedContentInset
表示

所以我的问题是如何妥善处理这个案件?有写的选项

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

但是它看起来很难看。也许有内置的方法来扩展键盘后面的插入部分?

显然,答案在官方文档中。我们不应该手动调整内容插入,而应该将这些内容委托给view controller,并处理它的安全区域插入。下面是工作代码:

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)
    })
}