Keyboard Avoidance — суть, методы реализации и смещение интерфейса

Автор: IT Sectr Опубликовано: 2026-07-09 Время чтения: 9 мин

Keyboard Avoidance — это техника адаптации интерфейса iOS-приложения при появлении системной клавиатуры, которая может перекрыть текстовые поля и другие интерактивные элементы. Без реализации этого механизма пользователь физически не видит, что вводит, что приводит к ошибкам и ухудшению опыта взаимодействия. По данным Apple Developer Documentation (2026), начиная с iOS 15 рекомендуется использовать UIScrollView в сочетании с UIScrollView.keyboardLayoutGuide для автоматического управления смещением контента.

Главное

  • Keyboard Avoidance — смещение контента вверх при появлении клавиатуры, чтобы активное текстовое поле оставалось видимым.
  • UIKeyboardWillShowNotification и UIKeyboardWillHideNotification предоставляют размер и анимацию клавиатуры для адаптации layout.
  • UIScrollView.keyboardLayoutGuide (iOS 15+) автоматически управляет отступами при появлении и скрытии клавиатуры.
  • IQKeyboardManager — популярная сторонняя библиотека для автоматического Keyboard Avoidance без ручного кода.
  • UITextFieldDelegate позволяет отслеживать начало и конец редактирования для точечного управления смещением.

Что такое Keyboard Avoidance

Keyboard Avoidance — это совокупность техник, обеспечивающих видимость активного поля ввода при появлении системной клавиатуры на iOS. Базовая проблема: клавиатура занимает до 50% экрана и перекрывает нижнюю половину интерфейса, включая текстовые поля, кнопки отправки и другие элементы.

Существует три основных подхода к реализации: ручное управление через Keyboard Notifications (классический способ, работает с iOS 3.0), использование UIScrollView с автоматической прокруткой (рекомендуется Apple), и Keyboard Layout Guide (современный способ с iOS 15+). Выбор зависит от минимальной поддерживаемой версии iOS и сложности интерфейса.

По данным Apple, отсутствие Keyboard Avoidance является одной из самых частых причин отклонения приложений при ревью, если текстовые поля полностью перекрываются клавиатурой. App Store Guidelines явно требуют, чтобы все интерактивные элементы оставались доступными при активном вводе.

Почему iOS не делает это автоматически

iOS не может автоматически определить, какой элемент должен оставаться видимым, потому что не знает семантики интерфейса. В простой форме с одним текстовым полем достаточно подвинуть весь экран. В сложном интерфейсе с кастомными панелями, floating-кнопками и несколькими секциями требуется разная логика поведения.

Кроме того, некоторые приложения намеренно не смещают контент — например, клавиатурные калькуляторы или редакторы, где клавиатура является частью рабочей области. iOS оставляет решение разработчику, предоставляя гибкие API для любого сценария.

Keyboard Frame Notifications

UIKeyboardWillShowNotification — основное уведомление, которое iOS отправляет перед появлением клавиатуры. Оно содержит CGRect с финальным положением клавиатуры в словаре UIResponder.keyboardFrameEndUserInfoKey, а также длительность анимации в UIResponder.keyboardAnimationDurationUserInfoKey.

Обработчик уведомления должен вычислить перекрытие между активным текстовым полем и клавиатурой, затем изменить нижний отступ (contentInset или frame) контейнера. Если поле находится ниже верхней границы клавиатуры, контент смещается вверх на величину перекрытия. При скрытии клавиатуры отступ возвращается к исходному значению.

swift
@objc func keyboardWillShow(_ notification: Notification) {
    guard let keyboardFrame = notification
        .userInfo?[UIResponder.keyboardFrameEndUserInfoKey]
        as? CGRect else { return }
    
    let keyboardHeight = keyboardFrame.height
    scrollView.contentInset.bottom = keyboardHeight
    scrollView.verticalScrollIndicatorInsets.bottom = keyboardHeight
}

При использовании уведомлений важно обрабатывать анимацию синхронно с системной клавиатурой. iOS передаёт кривую анимации (UIResponder.keyboardAnimationCurveUserInfoKey) и длительность. Используйте UIView.animate с этими параметрами, чтобы контент смещался плавно, одновременно с появлением клавиатуры.

Keyboard Layout Guide в iOS 15+

UIScrollView.keyboardLayoutGuide — это современное API для Keyboard Avoidance, представленное в iOS 15. Оно автоматически отслеживает положение клавиатуры и обновляет Auto Layout constraints, связывающие нижнюю часть интерфейса с верхней границей клавиатуры.

Для использования достаточно активировать layout guide у UIScrollView или UIStackView и привязать к нему нижний констрейнт контента. Никакой ручной работы с уведомлениями, вычислением высоты и анимацией не требуется — система делает всё автоматически, синхронизируя анимацию с появлением и скрытием клавиатуры.

swift
// Enable Keyboard Layout Guide (iOS 15+)
scrollView.keyboardLayoutGuide.followsUndockedKeyboard = true

// Pin bottom constraint to keyboard top
contentView.bottomAnchor.constraint(
    equalTo: scrollView.keyboardLayoutGuide.topAnchor
).isActive = true

followsUndockedKeyboard — свойство, определяющее, должен ли guide реагировать на клавиатуру, которая может быть откреплена от нижнего края (на iPad). Установите true, только если интерфейс корректно работает с плавающей клавиатурой. Для iPhone это свойство игнорируется — клавиатура всегда прикреплена к нижнему краю.

UIScrollView и клавиатура

UIScrollView — это контейнер, который Apple рекомендует использовать как основу для Keyboard Avoidance. Когда клавиатура появляется, scroll view увеличивает свой contentInset.bottom, позволяя прокрутить контент вверх и сделать активное поле видимым.

Ключевой метод — scrollRectToVisible, который программно прокручивает scroll view так, чтобы указанный прямоугольник (активное текстовое поле) оказался в видимой области. Комбинируя изменение contentInset с вызовом scrollRectToVisible, вы гарантируете, что поле не только не перекрыто, но и находится в верхней части видимой области.

swift
func adjustScrollForKeyboard(
    keyboardHeight: CGFloat,
    activeField: UIView
) {
    scrollView.contentInset.bottom = keyboardHeight
    scrollView.verticalScrollIndicatorInsets.bottom = keyboardHeight
    
    var visibleRect = view.frame
    visibleRect.size.height -= keyboardHeight
    
    if activeField.frame.origin.y > visibleRect.maxY {
        scrollView.scrollRectToVisible(
            activeField.frame, animated: true
        )
    }
}

Для UIViewController с UITableView Apple рекомендует использовать UITableViewController, который автоматически корректирует contentInset при появлении клавиатуры. Если вы используете UIViewController с добавленной таблицей, придётся реализовать Keyboard Avoidance вручную — UITableViewController не предоставляет этого поведения для кастомных контроллеров.

Auto Layout и Keyboard Avoidance

Auto Layout позволяет реализовать Keyboard Avoidance без программирования анимаций — достаточно изменить активность (isActive) определённого констрейнта или обновить его константу в ответ на уведомление клавиатуры.

Типичная схема: создать IBOutlet NSLayoutConstraint для нижнего отступа scroll view или контента, и в обработчике keyboardWillShow установить constraint.constant = keyboardHeight, а в keyboardWillHide — сбросить в 0. Обновите layout через layoutIfNeeded внутри animate-блока для плавного перехода.

ПодходiOS версияСложностьРекомендация
Keyboard NotificationsiOS 3.0+СредняяДля поддержки старых версий
UIScrollView + contentInsetiOS 2.0+НизкаяУниверсальный способ, Apple рекомендует
Keyboard Layout GuideiOS 15+МинимальнаяСовременный способ (iOS 15+)
IQKeyboardManageriOS 8.0+НулеваяБыстрое решение, популярная библиотека

При использовании UIStackView изменения констрейнтов нижнего отступа также работают: stack view перераспределяет дочерние элементы автоматически. Однако если stack view находится внутри UIScrollView, предпочтительнее управлять contentInset самого scroll view, а не констрейнтами внутри него.

Сторонние решения для Keyboard Avoidance

IQKeyboardManager — самая популярная библиотека (более 16 000 stars на GitHub), которая реализует автоматический Keyboard Avoidance без единой строки кода в контроллере. Она использует method swizzling для отслеживания текстовых полей и автоматически поднимает контент при появлении клавиатуры.

Библиотека предоставляет гибкие настройки: можно указать расстояние между полем и клавиатурой, включить/отключить для отдельных контроллеров, настроить поведение для UITextView и кастомных input view. Однако method swizzling может конфликтовать с другими библиотеками, и Apple не рекомендует этот подход для production-кода из-за непредсказуемых side-эффектов.

Альтернативы включают TPKeyboardAvoiding (лёгкая библиотека, ~2000 stars) и KeyboardManager от сообщества. Для современных проектов Apple рекомендует использовать встроенные средства iOS 15+, а для проектов с более низкой минимальной версией — UIScrollView с contentInset, который является самым надёжным встроенным решением.

Часто задаваемые вопросы

Что такое Keyboard Avoidance в iOS?

Keyboard Avoidance — это техника смещения интерфейса при появлении клавиатуры, чтобы активное текстовое поле оставалось видимым. Реализуется через UIScrollView, Keyboard Notifications или Keyboard Layout Guide iOS 15+ для автоматической адаптации layout.

Как реализовать Keyboard Avoidance без UIScrollView?

Можно изменить frame основного view при появлении клавиатуры, уменьшив его высоту на высоту клавиатуры. Используйте UIKeyboardWillShowNotification и UIKeyboardWillHideNotification, чтобы обновлять frame в блоке анимации с параметрами из userInfo уведомления.

Как работает keyboardLayoutGuide?

keyboardLayoutGuide — это UILayoutGuide, который добавляется к UIScrollView (iOS 15+). Он автоматически отслеживает верхнюю границу клавиатуры и обновляет свои NSLayoutConstraint при её появлении и скрытии, синхронизируя анимацию с системной клавиатурой.

Какие есть сторонние библиотеки для Keyboard Avoidance?

IQKeyboardManager — самая популярная, не требует кода. TPKeyboardAvoiding — лёгкая альтернатива. Для новых проектов предпочтительнее встроенные средства iOS 15+, так как сторонние библиотеки используют method swizzling, который Apple не рекомендует.

Как отключить Keyboard Avoidance для конкретного экрана?

Если используете IQKeyboardManager, вызовите enabled = false для конкретного UIViewController. Для ручной реализации просто не подписывайтесь на уведомления клавиатуры на этом экране или сбрасывайте contentInset до нуля при появлении клавиатуры.

Итоги

  • Keyboard Avoidance — обязательная техника для iOS-приложений с текстовым вводом, предотвращающая перекрытие полей клавиатурой.
  • UIKeyboardWillShowNotification и UIKeyboardWillHideNotification — классический API для ручного управления смещением контента.
  • UIScrollView с contentInset и scrollRectToVisible — универсальное решение, рекомендованное Apple.
  • Keyboard Layout Guide (iOS 15+) — современный способ без ручных уведомлений, использующий Auto Layout.
  • Auto Layout констрейнты с обновлением constant в анимационном блоке обеспечивают плавный переход контента.
  • IQKeyboardManager — популярная сторонняя библиотека для быстрого внедрения, но с ограничениями method swizzling.
  • Apple рекомендует UIScrollView с keyboardLayoutGuide для проектов с iOS 15+ и contentInset для проектов с более старыми версиями.

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также