Невозможно изменить высоту UIInputView
У меня есть простой подкласс UIInputViewController только с двумя переопределенными методами. Я использую этот контроллер ввода как inputAccessoryViewController
на моем подклассе UIViewController, который становится первым респондентом. Я пытаюсь указать высоту inputView, добавив ограничение, как рекомендует документация Apple. Проблема в том, что мое ограничение не работает, и я получаю исключение autolayout при добавлении моего ограничения
Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
...
(
"<NSLayoutConstraint:0x178aa1d0 V:[UIInputView:0x178a4ae0(0)]>",
"<NSLayoutConstraint:0x178b9520 V:[UIInputView:0x178a4ae0(500)]>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x178b9520 V:[UIInputView:0x178a4ae0(500)]>
Что, я думаю, означает, что система уже добавила ограничение нулевой высоты во входное представление (потому что оно создано с нулевой высотой). Теперь они конфликтуют, и autolayout ломает мое ограничение, чтобы решить проблему.
Когда я пытаюсь использовать его как inputViewController
моего контроллера представления (только для целей тестирования), я получаю то же исключение, но вместо нулевой высоты это 216 пикселей. Это также нарушает мои ограничения, а высота остается по умолчанию.
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
self.inputView.translatesAutoresizingMaskIntoConstraints = NO;
self.inputView.backgroundColor = [UIColor redColor];
}
- (void)updateViewConstraints {
CGFloat _expandedHeight = 500;
NSLayoutConstraint *_heightConstraint =
[NSLayoutConstraint constraintWithItem:self.view
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:0.0
constant: _expandedHeight];
[self.inputView addConstraint: _heightConstraint];
[super updateViewConstraints];
}
-(void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[self.view setNeedsUpdateConstraints];
}
В результате я не могу изменить высоту представления вспомогательного ввода. Кто-нибудь преуспел в этом? Очевидно, что документация Apple не помогает...
4 ответа
Начиная с iOS 9.0 это можно решить с помощью inputView.allowsSelfSizing = YES;
Я не знаю, является ли это проблемой, но проблема может быть связана с множителем 0.0, который вы устанавливаете на _heightConstraint. Попробуйте изменить его на 1,0.
Это будет выглядеть так:
NSLayoutConstraint *_heightConstraint =
[NSLayoutConstraint constraintWithItem:self.view
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1.0
constant: _expandedHeight];
Надеюсь это поможет!
Когда вы создаете представление вспомогательного представления ввода UITextView, как только текстовое представление становится первым респондентом, ограничение высоты добавляется автоматически, устанавливая то, что было отправлено в качестве высоты кадра. Например:
let inputView = UIInputView(frame: CGRectMake(0, 0, view.bounds.width, 200),
inputViewStyle: .Default)
someTextView.inputAccessoryView = inputView
someTextView.becomeFirstResponder()
assert((inputView.constraints().last as NSLayoutConstraint).constant == 200)
Вы можете изменить это ограничение по факту.
Я сделал это в Swift. надеюсь, это поможет вам.
override func viewDidAppear(animated: Bool) {
let heightConstraint = NSLayoutConstraint(
item:self.view,
attribute:NSLayoutAttribute.Height,
relatedBy:NSLayoutRelation.Equal,
toItem:nil,
attribute:NSLayoutAttribute.NotAnAttribute,
multiplier:0.0,
constant:100)
self.view.addConstraint(heightConstraint)
}