Предотвратить вызов viewDidLayoutSubviews при взаимодействии пользователя с настраиваемой клавиатурой iOS 8

Я разрабатываю пользовательскую клавиатуру iOS 8 и столкнулся со следующей проблемой:

Метод - (void) viewDidLayoutSubviews{} из подкласса UIInputViewController вызывается каждый раз, когда пользователь касается клавиатуры (касание, свайп и т. д.). Я хотел бы избежать этого, нет необходимости вызывать его, когда пользователь касается клавиатуры.

Также я обнаружил, что если я прокомментирую следующие строки, viewDidLayoutSubviews больше не будет вызываться, когда пользователь взаимодействует с клавиатурой:

NSLayoutConstraint *keyboardButtonLeftSideConstraint = [NSLayoutConstraint constraintWithItem:self.customKeyboardView attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0.0];
NSLayoutConstraint *keyboardButtonBottomConstraint = [NSLayoutConstraint constraintWithItem:self.customKeyboardView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0.0];
[self.view addConstraints:@[keyboardButtonLeftSideConstraint, keyboardButtonBottomConstraint]];

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


person iOS Dev    schedule 10.01.2015    source источник


Ответы (1)


Я настоятельно рекомендую вам не использовать viewDidLayoutSubviews (а также viewWillLayoutSubviews) в расширении клавиатуры. Они будут вызываться из-за изменения фрейма, изменения ограничений и многих других событий, которые иногда вызывают неожиданные проблемы. viewDidAppear может быть заменой.

Если вам действительно нужно переопределить viewDidLayoutSubviews, попробуйте использовать флаги, чтобы предотвратить его неправильный вызов.

-(void)viewDidLayoutSubviews {
    if (self.alreadyLoaded) {
        return;
    }
    else {
    //...
    }
}
person skyline75489    schedule 10.01.2015