Sobes.tech
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) Кривая анимации.