Принятый ответ не работал на iOS 9. Я объединил его и некоторые другие предложения здесь вместе с кодом Apple в Руководстве по программированию расширения приложений .
Это решение отлично работает, так как оно не задерживает изменение высоты до viewDidAppear
, а при повороте вы можете изменить высоту, если хотите, на основе размера экрана. Проверено это работает в iOS 8 и 9.
Несколько важных заметок: ~ По крайней мере, одному элементу в inputView
необходимо использовать автоматический макет ~ Ограничение высоты не может быть активировано пока viewWillAppear
~ priority
ограничения высоты необходимо понизить, чтобы избежать неудовлетворительных ограничений ~ updateViewConstraints
- хорошее место для установки желаемой высоты
Советы: ~ При тестировании на симуляторе я обнаружил, что он очень шелушащийся и будет вести себя неожиданно. Если это вам поможет, перезагрузите симулятор и снова запустите. Или вы можете просто отключить клавиатуру и добавить ее снова.
Примечание: ~ Это не работает в бета-версии iOS 10. Он правильно изменит высоту, когда появится, но если вы повернете устройство, высота не изменится. Это связано с тем, что updateViewConstraints
не запускается при вращении. Пожалуйста, напишите отчет об ошибке в отношении iOS 10. Чтобы решить эту проблему, вы можете инициировать изменение constant
в viewDidLayoutSubviews
.
var nextKeyboardButton: UIButton!
var heightConstraint: NSLayoutConstraint?
override func viewDidLoad() {
super.viewDidLoad()
self.nextKeyboardButton = UIButton(type: .System)
self.nextKeyboardButton.setTitle(NSLocalizedString("Next Keyboard", comment: "Title for 'Next Keyboard' button"), forState: .Normal)
self.nextKeyboardButton.sizeToFit()
self.nextKeyboardButton.translatesAutoresizingMaskIntoConstraints = false
self.nextKeyboardButton.addTarget(self, action: "advanceToNextInputMode", forControlEvents: .TouchUpInside)
self.view.addSubview(self.nextKeyboardButton)
let nextKeyboardButtonLeftSideConstraint = NSLayoutConstraint(item: self.nextKeyboardButton, attribute: .Left, relatedBy: .Equal, toItem: self.view, attribute: .Left, multiplier: 1, constant: 0)
let nextKeyboardButtonBottomConstraint = NSLayoutConstraint(item: self.nextKeyboardButton, attribute: .Bottom, relatedBy: .Equal, toItem: self.view, attribute: .Bottom, multiplier: 1, constant: 0)
NSLayoutConstraint.activateConstraints([nextKeyboardButtonLeftSideConstraint, nextKeyboardButtonBottomConstraint])
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
self.heightConstraint = NSLayoutConstraint(item:self.inputView!, attribute:.Height, relatedBy:.Equal, toItem:nil, attribute:.NotAnAttribute, multiplier:0, constant:0)
self.heightConstraint!.priority = 999
self.heightConstraint!.active = true
}
override func updateViewConstraints() {
super.updateViewConstraints()
guard self.heightConstraint != nil && self.view.frame.size.width != 0 && self.view.frame.size.height != 0 else { return }
let portraitHeight: CGFloat = 400
let landscapeHeight: CGFloat = 200
let screenSize = UIScreen.mainScreen().bounds.size
let newHeight = screenSize.width > screenSize.height ? landscapeHeight : portraitHeight
if (self.heightConstraint!.constant != newHeight) {
self.heightConstraint!.constant = newHeight
}
}