【问题标题】:Prevent calling of viewDidLayoutSubviews on user interaction with iOS 8 custom keyboard防止在用户与 iOS 8 自定义键盘交互时调用 viewDidLayoutSubviews
【发布时间】:2015-03-08 14:12:09
【问题描述】:

我正在开发 iOS 8 自定义键盘,但遇到以下问题:

每次用户触摸键盘(点击、滑动等)时,都会调用来自UIInputViewController 子类的- (void) viewDidLayoutSubviews{} 方法。我想避免这种情况,当用户触摸键盘时不需要调用它。

我还发现,如果我评论以下几行,当用户与键盘交互时,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]];

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

【问题讨论】:

    标签: ios objective-c ios8 keyboard custom-keyboard


    【解决方案1】:

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

    如果你真的必须重写 viewDidLayoutSubviews,请尝试使用标志来防止它被错误地调用。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-30
      • 2014-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多