Руководство по 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
.
Работа с плавающей клавиатурой
Сначала мы должны включить отслеживание клавиатуры, по умолчанию оно отключено:
view.keyboardLayoutGuide.followsUndockedKeyboard = true
Теперь loginButton
начинает следить за клавиатурой:
Она отлично работает, но здесь у нас есть крайние случаи. Когда мы перемещаем клавиатуру вверх, она может оказаться за пределами рамки обзора.
Фактически, 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.