防止在用户与 iOS 8 自定义键盘交互时调用 viewDidLayoutSubviews

Prevent calling of viewDidLayoutSubviews on user interaction with iOS 8 custom keyboard

我正在开发 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]];

但我无法摆脱这些限制,因为我需要它们来改变键盘的高度。我该如何解决这个问题?

我强烈建议您不要在键盘扩展中使用 viewDidLayoutSubviews(以及 viewWillLayoutSubviews)。它们会由于框架改变、约束改变等许多其他事件而被调用,这有时会导致意想不到的问题。 viewDidAppear 可以替代。

如果您真的必须覆盖 viewDidLayoutSubviews,请尝试使用标志来防止它被错误调用。

-(void)viewDidLayoutSubviews {
    if (self.alreadyLoaded) {
        return;
    }
    else {
    //...
    }
}