Прыгающая клавиатура при попытке добавить ограничения в пользовательской клавиатуре

Вопрос или проблема

Я пытался собрать свою собственную клавиатуру для использования во всех приложениях 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
    }
}

Разъяснение изменений:

  1. Установка ограничений в viewDidLoad: Я перенес установку ограничения высоты в метод viewDidLoad, чтобы оно устанавливалось один раз при загрузке вида. Это уменьшает вероятность попыток повторного изменения размера.

  2. Ограничение ширины (если необходимо): Я добавил пример ограничения ширины, чтобы гарантировать, что вид клавиатуры соответствует ширине экрана. Это также поможет избежать конфликтов, связанных с адаптацией размеров.

Дополнительные рекомендации:

  • Убедитесь, что вы не меняете размеры клавиатуры в других местах вашего кода, так как это может также вызвать "прыгание".
  • Проверьте настройки в Interface Builder (если используете его) и убедитесь, что там нет конфликтов с автоматическими ограничениями.

Если после внесения вышеуказанных изменений проблема с "прыжками" клавиатуры всё ещё сохраняется, возможно, стоит рассмотреть использование layoutIfNeeded или updateConstraints для обновления представления при изменениях.

Оцените материал
Добавить комментарий

Капча загружается...