Исключение нижней безопасной зоны работало на меня:

руководство по макету безопасной области, представленное в 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)? Или в другом месте?

Спасибо

Ответы на вопрос(1)

Ваш ответ на вопрос