Невозможно изменить высоту UIInputView

У меня есть простой подкласс UIInputViewController с двумя переопределенными методами. Я использую этот контроллер представления ввода как inputAccessoryViewController в моем подклассе UIViewController, который становится первым ответчиком. Я пытаюсь указать высоту inputView, добавив ограничение, как рекомендует документация Apple. Проблема в том, что мое ограничение не работает, и я получаю исключение автоопределения при добавлении моего ограничения.

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)]>

Что я думаю, означает, что система уже добавила ограничение высоты к входному представлению (потому что оно создается с нулевой высотой). Теперь они конфликтуют и автоотключение прерывает мое ограничение, чтобы исправить проблему.

Когда я пытаюсь использовать его как inputViewController моего контроллера представления (только для тестовых целей), я получаю такое же исключение, но вместо нулевой высоты он равен 216 px. Он также нарушает мое ограничение, и высота остается невыполненной.

- (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 не дает никакой помощи...

Ответ 1

Так как iOS 9.0 можно решить с помощью inputView.allowsSelfSizing = YES;

Ответ 2

Я не знаю, если это проблема, но проблема может возникнуть из множителя 0.0, который вы устанавливаете на _heightConstraint. Попробуйте изменить его на 1.0.

Это будет выглядеть так:

NSLayoutConstraint *_heightConstraint = 
    [NSLayoutConstraint constraintWithItem:self.view
                                 attribute:NSLayoutAttributeHeight
                                 relatedBy:NSLayoutRelationEqual
                                    toItem:nil
                                 attribute:NSLayoutAttributeNotAnAttribute
                                 multiplier:1.0
                                   constant: _expandedHeight];

Надеюсь, это поможет!

Ответ 3

Когда вы просматриваете представление вспомогательного входа в 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)

Вы можете изменить это ограничение после факта.

Ответ 4

Я сделал это в Свифт. надеюсь, это поможет вам.

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)
}