Расширение приложения для пользовательской клавиатуры iOS 8 - изменение высоты для ориентации

В зависимости от документации изменить высоту пользовательской клавиатуры просто. Ниже приведена эквивалентная версия кода в документации Apple.

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

    let constraint = NSLayoutConstraint(item: self.view, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 0.0, constant: 400.0)
    self.view.addConstraint(constraint)
}

Это работает, но изменяет высоту до значения CONSTANT, что нежелательно, если вы меняете ориентацию устройства. Установка высоты клавиатуры на 400.0 может быть удобной в портретном режиме, но, вероятно, не будет подходящей в альбомном режиме. Например: стандартный размер клавиатуры для iPhone 5 составляет 320 216 в портретной ориентации и 568 162 в альбомной. Установка постоянной высоты изменяет размер изображения клавиатуры до 320 400 в портретной ориентации и 568 400 (что фактически составляет весь экран) в альбомной ориентации.

Сейчас я думал только о том, чтобы создать словарь, содержащий размер представления клавиатуры для каждого типа устройства и каждой ориентации, а затем обновлять ограничение постоянной высоты каждый раз, когда устройство меняет ориентацию. Кто-нибудь нашел более элегантное решение?

1 ответ

Решение

Я сделал это путем реализации willAnimateRotationToInterfaceOrientation: в контроллере вида моей клавиатуры. Теоретически мы должны использовать новый willTransitionToTraitCollection:withTransitionCoordinator: или в идеале может быть viewWillTransitionToSize:withTransitionCoordinator:, но кажется, что они не вызываются на UIInputViewControllers, по крайней мере, начиная с 8.0.2. Таким образом, в настоящее время наилучшим вариантом является сохранение ссылки на ваш heightConstraint и изменение константы в вашей реализации willAnimateRotation,

Кроме того, я помню, что была небольшая хитрость с фактическим выяснением новой ориентации; В итоге я сделал что-то вроде:

let isLandscape: Bool = UIInterfaceOrientationIsLandscape(toInterfaceOrientation) а затем с помощью этого.

Другие вопросы по тегам