Я создаю расширение для практики, чтобы просто вызывать его, и оно контролирует высоту просмотра, когда клавиатура поднята, и облегчает работу в будущем.
Вот скриншот:
(Я создал scrollView внутри родительского представления контроллера, поэтому, когда клавиатура включена, пользователь может прокрутить всю страницу)
Проблема:
1 - высота клавиатуры иногда неверна, зависит от того, как я подключаю нижнее ограничение scrollView.
2 - иногда это должно давать нижнему ограничению scrollView отрицательное значение, чтобы уменьшить scrollView, а иногда ему нужно положительное значение! Это также зависит от того, как вы соединяете нижнее ограничение scrollView с его superView (именно поэтому я создал переменную isReverse).
вот мое расширение:
extension UIViewController {
func watchKeyboard() {
NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
}
@objc private func keyboardWillShow(notification: NSNotification) {
let isReverse = true // in some case you should turn this boolean to false to get the proper result.
if tabBarController != nil {
if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
if let bottomConstraint = view.constraints.filter({ $0.firstAttribute == .bottom }).first {
UIView.animate(withDuration: 0.4) {
if isReverse {
bottomConstraint.constant = -keyboardSize.height + self.tabBarController!.tabBar.frame.size.height
} else {
bottomConstraint.constant = keyboardSize.height - self.tabBarController!.tabBar.frame.size.height
}
self.view.layoutIfNeeded()
}
}
}
} else {
if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
let isReverse = true // in some case you should turn this boolean to false to get the proper result.
if let bottomConstraint = view.constraints.filter({ $0.firstAttribute == .bottom }).first {
UIView.animate(withDuration: 0.4) {
bottomConstraint.constant = isReverse ? -keyboardSize.height : keyboardSize.height
self.view.layoutIfNeeded()
}
}
}
}
}
@objc private func keyboardWillHide(notification: NSNotification) {
if let bottomConstraint = view.constraints.filter({ $0.firstAttribute == .bottom }).first {
UIView.animate(withDuration: 0.4) {
bottomConstraint.constant = 0
self.view.layoutIfNeeded()
}
}
}
}
Заранее спасибо ...