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

Это работает, но меняет высоту на ПОСТОЯННОЕ значение, что нежелательно, если вы меняете ориентацию устройства. Установка высоты клавиатуры на 400,0 может быть хорошей в портретном режиме, но, вероятно, не будет подходить в ландшафтном режиме. Например: стандартный размер клавиатуры для iPhone 5 составляет 320 216 в портретной ориентации и 568 162 в альбомной ориентации. Установка постоянной высоты изменяет размер экрана клавиатуры на 320 400 в портретной ориентации и на 568 400 (что фактически составляет весь экран) в альбомной ориентации.

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


person Jon    schedule 21.09.2014    source источник
comment
Ищу тот же ответ   -  person honcheng    schedule 25.09.2014


Ответы (1)


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

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

let isLandscape: Bool = UIInterfaceOrientationIsLandscape(toInterfaceOrientation), а затем используя это.

person cmyr    schedule 19.10.2014