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

时间:2015-01-10 08:48:05

标签: ios objective-c ios8 keyboard 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]];

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

1 个答案:

答案 0 :(得分:0)

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

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

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