防止在用户与 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 {
//...
}
}
我正在开发 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 {
//...
}
}