Назад к вопросам
Middle
85
questionbank

Что можно сделать, если клавиатура при появлении скрывает важные элементы интерфейса?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

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