iOS 11 中引入的新安全区域布局指南非常适合防止内容显示在栏下方,但它不包括键盘。这意味着当显示键盘时,内容仍然隐藏在它后面,这就是我要解决的问题。
我的方法是基于收听键盘通知,然后通过additionalSafeAreaInsets
.
这是我的代码:
override func viewDidLoad() {
let notificationCenter = NotificationCenter.default
notificationCenter.addObserver(self, selector: #selector(keyboardWillShow(notification:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
notificationCenter.addObserver(self, selector: #selector(keyboardWillHide(notification:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
notificationCenter.addObserver(self, selector: #selector(keyboardWillChange(notification:)), name: NSNotification.Name.UIKeyboardWillChangeFrame, object: nil)
}
//MARK: - Keyboard
extension MyViewController {
@objc func keyboardWillShow(notification: NSNotification) {
let userInfo = notification.userInfo!
let keyboardHeight = (userInfo[UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue.height
additionalSafeAreaInsets = UIEdgeInsets(top: 0, left: 0, bottom: keyboardHeight, right: 0)
UIView.animate(withDuration: 0.3) {
self.view.layoutIfNeeded();
}
}
@objc func keyboardWillHide(notification: NSNotification) {
additionalSafeAreaInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
UIView.animate(withDuration: 0.3) {
self.view.layoutIfNeeded();
}
}
@objc func keyboardWillChange(notification: NSNotification) {
let userInfo = notification.userInfo!
let keyboardHeight = (userInfo[UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue.height
additionalSafeAreaInsets = UIEdgeInsets(top: 0, left: 0, bottom: keyboardHeight, right: 0)
UIView.animate(withDuration: 0.3) {
self.view.layoutIfNeeded();
}
}
}
这很有效,因为MyController
is aUIViewController
延伸UITableView
到整个安全区域。现在当键盘出现时,底部被向上推,这样键盘后面就没有单元格了。
问题在于底栏。我在底部还有一个工具栏,它已经包含在安全区域中。因此,将全键盘高度设置为额外的安全区域插入会将表格视图的底部向上推太多,正好是底部栏的高度。为了使这种方法正常工作,我必须将 设置additionalSafeAreaInsets.bottom
为等于键盘高度减去底部栏的高度。
问题1:获得底部当前安全区域间隙的最佳方法是什么?手动获取工具栏的框架并使用它的高度?或者是否可以直接从安全区域布局指南中获取间隙?
问题2:据推测,底栏应该可以在不改变键盘大小的情况下改变大小,所以我还应该实现一些方法来监听栏的框架变化。这是最好的viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator)
吗?还是别处?
谢谢