У меня есть UITextField
, встроенный в UIScrollView
. Текстовое поле скрывается клавиатурой при появлении клавиатуры.
Я использую следующий код, который устанавливает наблюдателей для UIResponder.keyboardWillShowNotification
и UIResponder.keyboardWillHideNotification
и соответственно устанавливает contentInset
UIScrollView
.
extension ViewController {
func addKeyboardNotificationsObserver() {
NotificationCenter.default.addObserver(
self,
selector: #selector(keyboardWillBeShown(notification:)),
name: UIResponder.keyboardWillShowNotification,
object: nil
)
NotificationCenter.default.addObserver(
self,
selector: #selector(keyboardWillBeHidden(notification:)),
name: UIResponder.keyboardWillHideNotification,
object: nil
)
}
@objc func keyboardWillBeShown(notification: NSNotification) {
guard
let kbRect = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect,
let duration = notification.userInfo?[UIResponder.keyboardAnimationDurationUserInfoKey] as? NSNumber,
let curve = notification.userInfo?[UIResponder.keyboardAnimationCurveUserInfoKey] as? NSNumber
else { return }
let insets = UIEdgeInsets(top: 0, left: 0, bottom: kbRect.height, right: 0)
UIView.animate(
withDuration: duration.doubleValue,
delay: .zero,
options: .init(rawValue: curve.uintValue << 16),
animations: {
self.scrollView.contentInset = insets
self.scrollView.scrollIndicatorInsets = insets
},
completion: nil
)
}
@objc func keyboardWillBeHidden(notification: NSNotification) {
scrollView.contentInset = .zero
scrollView.scrollIndicatorInsets = .zero
}
}
Код работает. Однако текстовое поле частично скрывается при появлении клавиатуры. Текстовое поле появляется вверх в конце анимации.
Может кто-нибудь указать, как это исправить, чтобы текстовое поле двигалось синхронно c с приближающейся клавиатурой и не появляется как подпрыгивающая ближе к концу анимации?