Вопрос или проблема
Я пытался собрать свою собственную клавиатуру для использования во всех приложениях iOS. Когда я пытался добавить ограничение по высоте, высота клавиатуры продолжала увеличиваться.
import UIKit
class KeyboardViewController: UIInputViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
view.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
view.heightAnchor.constraint(equalToConstant: 260)
])
}
}
Вот гифка
https://s11.gifyu.com/images/SBHgS.gif
Ответ или решение
Проблема, с которой вы столкнулись, связана с тем, что изменение ограничения высоты вашего пользовательского клавиатурного контроллера после его инициализации может вызвать конфликты и неустойчивое поведение, такое как "прыгающая" высота клавиатуры. Ваша реализация установления ограничения высоты в методе viewWillAppear
может быть причиной того, что система пытается динамически изменять размеры вашего контроллера вида, что приводит к нежелательному поведению.
Для решения этой проблемы вы можете попробовать несколько методов. Вот исправленный пример кода с разъяснением:
import UIKit
class KeyboardViewController: UIInputViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Устанавливаем представление клавиатуры в нужный размер.
self.view.translatesAutoresizingMaskIntoConstraints = false
// Устанавливаем высоту клавиатуры через ограничение.
let heightConstraint = self.view.heightAnchor.constraint(equalToConstant: 260)
heightConstraint.isActive = true
// Добавляем дополнительное ограничение на ширину, если необходимо.
let widthConstraint = self.view.widthAnchor.constraint(equalToConstant: UIScreen.main.bounds.width)
widthConstraint.isActive = true
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// Здесь мы не устанавливаем ограничения высоты снова
// Так как они уже установлены в viewDidLoad
}
}
Разъяснение изменений:
-
Установка ограничений в viewDidLoad: Я перенес установку ограничения высоты в метод
viewDidLoad
, чтобы оно устанавливалось один раз при загрузке вида. Это уменьшает вероятность попыток повторного изменения размера. -
Ограничение ширины (если необходимо): Я добавил пример ограничения ширины, чтобы гарантировать, что вид клавиатуры соответствует ширине экрана. Это также поможет избежать конфликтов, связанных с адаптацией размеров.
Дополнительные рекомендации:
- Убедитесь, что вы не меняете размеры клавиатуры в других местах вашего кода, так как это может также вызвать "прыгание".
- Проверьте настройки в Interface Builder (если используете его) и убедитесь, что там нет конфликтов с автоматическими ограничениями.
Если после внесения вышеуказанных изменений проблема с "прыжками" клавиатуры всё ещё сохраняется, возможно, стоит рассмотреть использование layoutIfNeeded
или updateConstraints
для обновления представления при изменениях.