Гайд по UIKeyboardLayoutGuide

image
Обработка показа клавиатуры – это распространенная задача при создании интерфейса приложения. С выходом iOS 14 это работает автоматически для SwiftUI компонентов. Но что со старым-добрым UIKit? Раньше мы использовали нотификации клавиатуры, проверяли ее высоту и обновляли необходимые constraints. В iOS 15 появился новый гайд — UIKeyboardLayoutGuide. Если вы уже знакомы с такими гайдами, как safeAreaLayoutGuide и readableContentGuide, новый покажется вам супер интуитивным. Давайте попробуем использовать его на простом примере — экране авторизации с текстовыми полями и кнопкой логина, закрепленной внизу.

Базовое использование

Мы добавляем всего два constraints с отступами по умолчанию:

view.addSubview(loginButton)
let buttonBottom = view.keyboardLayoutGuide.topAnchor.constraint(equalToSystemSpacingBelow: loginButton.bottomAnchor, multiplier: 1.0)
let buttonTrailing = view.keyboardLayoutGuide.trailingAnchor.constraint(equalToSystemSpacingAfter: loginButton.trailingAnchor, multiplier: 1.0)
NSLayoutConstraint.activate([buttonBottom, buttonTrailing])

Вёрстка loginButton привязана к изменениям клавиатуры. Когда клавиатура скрывается, keyboardLayoutGuide.topAnchor совпадает с safeAreaLayoutGuide.bottomAnchor.

image

На этом все, спасибо, что пришли на мой TED Talk! Хотя погодите, клавиатура не так проста,
особенно на iPadOS. Вы можете открепить и переместить её в любое место. К счастью, гайд для клавиатуры помогает справиться с этой задачей.

Работа с плавающими клавиатурами

В начале мы должны обеспечить трекинг клавиатуры, по умолчанию эта функция отключена:

view.keyboardLayoutGuide.followsUndockedKeyboard = true

Теперь loginButton начинает следовать за клавиатурой:

Работает прекрасно, но здесь нужно учитывать границы экрана. Когда мы двигаем клавиатуру наверх, loginButton может оказаться за пределами размеров superview.

Вообще, UIKeyboardLayoutGuide – это подкласс UITrackingLayoutGuide. Это гайд, который автоматически активирует и деактивирует constraints в зависимости от близости к краям экрана.

Чтобы воспользоваться этим, нам необходимо заменить constraint buttonTrailing на:

let buttonTop = view.keyboardLayoutGuide.topAnchor.constraint(equalToSystemSpacingBelow: loginButton.bottomAnchor, multiplier: 1.0)
buttonTop.identifier = "buttonTop"
view.keyboardLayoutGuide.setConstraints([buttonTop], activeWhenAwayFrom: .top)

Constraint buttonTop будет активным, только когда клавиатура находится далеко от верхней границы экрана.

Наконец, мы добавляем constraint buttonBottom, чтобы закрепить loginButton внизу клавиатуры:

let buttonBottom = loginButton.topAnchor.constraint(equalToSystemSpacingBelow: view.keyboardLayoutGuide.bottomAnchor, multiplier: 1.0)
buttonBottom.identifier = "buttonBottom"
view.keyboardLayoutGuide.setConstraints([buttonBottom], activeWhenNearEdge: .top)

Заметка: Настройка идентификаторов для NSLayoutConstraint позволяет легко найти ограничители во время дебага.

Ну а вот финальное демо нашего примера. Также я добавил leading и trailing constraints. Проект можно найти на Github.

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

  • Google уменьшил количество пунктов в расширенных результатах FAQGoogle уменьшил количество пунктов в расширенных результатах FAQ Google внес изменение в отображение расширенных результатов FAQ в результатах поиска. Теперь они будут включать только два пункта. Об этом сообщает Search Engine Land. Раньше Google показывал больше пунктов в результатах этого типа. На днях зарубежные специалисты обратили внимание, что […]
  • Глава Instagram о том, что TikTok делает лучшеГлава Instagram о том, что TikTok делает лучше В Q&A-сессии в рамках Creator Week глава Instagram Адам Моссери поделился своими мыслями о том. Что TikTok делает лучше. Чем сервис фотошеринга. Он также ответил на вопросы касательно вовлеченности и монетизации. А также о более широком запуске Reels. Что TikTok делает лучше. Чем […]
  • Дизайн-спринт: Основы методаДизайн-спринт: Основы метода Описание Онлайн-курс для начинающих спринт-мастеров по основам методологии «дизайн-спринт» от Google Ventures c сертификатом спринт-мастера. Научитесь двигать команду от исследований до прототипа за 5 дней!Дизайн-спринт — новый формат образовательного […]
  • 3D Graphics Rendering Cookbook3D Graphics Rendering Cookbook В августе этого года, после полутора лет напряженной работы, наконец-то вышла наша третья книга (про первую и вторую уже были посты на Хабре) ориентированная на разработку игр: 3D Graphics Rendering Cookbook: A comprehensive guide to exploring rendering algorithms in modern OpenGL and […]