Back to questions
Middle
127
questionbank
Что можно сделать, если клавиатура при появлении скрывает важные элементы интерфейса?
Sobes Copilot
Get answers in real time
Answer from AI
sobes.tech AI
Использовать NotificationCenter для отслеживания появления (UIKeyboardWillShowNotification) и скрытия (UIKeyboardWillHideNotification) клавиатуры. В обработчиках этих событий можно изменить отступы или сдвинуть содержимое ScrollView или TableView.
Альтернативные подходы:
- Использовать библиотеку
IQKeyboardManagerSwift. Она автоматически управляет сдвигом контента. - В SwiftUI использовать модификатор
.ignoresSafeArea(.keyboard, edges: .bottom).
Пример кода для ручной обработки через NotificationCenter:
// Подписка на уведомления
NotificationCenter.default.addObserver(self,
selector: #selector(keyboardWillShow(_:)),
name: UIResponder.keyboardWillShowNotification,
object: nil)
NotificationCenter.default.addObserver(self,
selector: #selector(keyboardWillHide(_:)),
name: UIResponder.keyboardWillHideNotification,
object: nil)
// Обработчик появления клавиатуры
@objc func keyboardWillShow(_ notification: Notification) {
guard let userInfo = notification.userInfo,
let keyboardFrame = userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect else {
return
}
// Анимированное изменение отступа скроллвью
let contentInsets = UIEdgeInsets(top: 0.0, left: 0.0, bottom: keyboardFrame.height, right: 0.0)
scrollView.contentInset = contentInsets
scrollView.scrollIndicatorInsets = contentInsets
// Прокрутка к активному полю ввода
if let activeField = activeTextField { // activeTextField - поле, которое сейчас активно
let activeFieldRect = scrollView.convert(activeField.bounds, from: activeField)
scrollView.scrollRectToVisible(activeFieldRect, animated: true)
}
}
// Обработчик скрытия клавиатуры
@objc func keyboardWillHide(_ notification: Notification) {
let contentInsets = UIEdgeInsets.zero
scrollView.contentInset = contentInsets
scrollView.scrollIndicatorInsets = contentInsets
}
// Не забыть отписаться от уведомлений при деинициализации
deinit {
NotificationCenter.default.removeObserver(self)
}
Ключевые свойства из словаря userInfo уведомления:
| Ключ | Тип | Описание |
|---|---|---|
UIResponder.keyboardFrameBeginUserInfoKey |
CGRect |
Начальная рамка клавиатуры в координатах экрана. |
UIResponder.keyboardFrameEndUserInfoKey |
CGRect |
Конечная рамка клавиатуры в координатах экрана. |
UIResponder.keyboardAnimationDurationUserInfoKey |
Double |
Длительность анимации появления/скрытия клавиатуры. |
UIResponder.keyboardAnimationCurveUserInfoKey |
UInt (RAW UIView.AnimationCurve) |
Кривая анимации. |