Расширение приложения для пользовательской клавиатуры 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)
а затем с помощью этого.