Руководство по UIKeyboardLayoutGuide

Распространенной задачей при создании макета приложения является клавиатура. Начиная с iOS 14.0 это работает автоматически для представлений SwiftUI. А как насчет старого, но хорошего UIKit? Ранее мы использовали уведомления с клавиатуры, проверяли высоту клавиатуры и обновляли связанные ограничения. iOS 15 представляет новое руководство по макету – UIKeyboardLayoutGuide. Это понятно, если вы знакомы с другими руководствами, такими как safeAreaLayoutGuide и readableContentGuide. Давайте попробуем использовать это на простом примере (экран входа в систему с текстовыми полями и кнопкой входа, прикрепленной внизу).

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

Мы добавляем всего два ограничения с системным интервалом:

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.
a5d2ad22-38ee-44c2-aecf-a10f58de8657.png

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

Сначала мы должны включить отслеживание клавиатуры, по умолчанию оно отключено:

view.keyboardLayoutGuide.followsUndockedKeyboard = true

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


8572a4fe-92eb-4b78-99a5-1303c1846560.png

Она отлично работает, но здесь у нас есть крайние случаи. Когда мы перемещаем клавиатуру вверх, она может оказаться за пределами рамки обзора.

Фактически, UIKeyboardLayoutGuide это подкласс UITrackingLayoutGuide. Это руководство по макету, которое автоматически активирует и деактивирует ограничения в зависимости от его близости к краям. Чтобы использовать это, мы заменяем  ограничение buttonTrailing на:

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

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

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

Примечание. Настройка идентификаторов для NSLayoutConstraint позволяет легко находить ограничения во время отладки.

Я также добавил несколько начальных и конечных ограничений. Проверьте UIKeyboardLayoutGuideExample на Github.

Ответить