自Apple推出safe area insets
和adjusted 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
仅表示用户定义的插入内容,真实插入内容由iOS 11中引入的adjustedContentInset
表示。
所以我的问题是如何以良好的方式处理这个案子?可以选择写
self.tableView.contentInset.bottom = keyboardTop - self.tableView.adjustedContentInset.bottom
但它看起来很难看。也许有内置的方法来扩展键盘后面的插图?
答案 0 :(得分: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)
})
}