Исключение нижней безопасной зоны работало на меня:
руководство по макету безопасной области, представленное в 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
этоUIViewController
сUITableView
который простирается через всю безопасную зону. Теперь, когда появляется клавиатура, нижняя часть выдвигается вверх, так что за клавиатурой нет ячеек.
Проблема с нижними барами. У меня также есть панель инструментов внизу, которая уже включена в безопасную зону. Следовательно, установка полной высоты клавиатуры в качестве дополнительной вставки безопасной области слишком сильно увеличивает нижнюю часть представления таблицы точно на высоту нижней панели. Чтобы этот метод работал хорошо, я должен установитьadditionalSafeAreaInsets.bottom
быть равным высоте клавиатуры минус высота нижней панели.
Вопрос 1: Каков наилучший способ получить текущий разрыв безопасной зоны снизу? Вручную достать рамку панели инструментов и использовать ее высоту? Или возможно получить разрыв непосредственно из руководства по планировке безопасной зоны?
Вопрос 2: Предполагается, что нижняя панель должна иметь возможность изменять размер без изменения размера клавиатуры, поэтому я также должен реализовать метод прослушивания изменений в рамке панели. Это лучше всего сделано вviewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator)
? Или в другом месте?
Спасибо