【问题标题】:Auto Layout error自动布局错误
【发布时间】:2013-03-07 13:48:42
【问题描述】:

我遇到了与this poster 类似的问题。我使用 jrturton 的建议将自定义按钮的代码移动到viewDidLayoutSubviews。在我收到此错误之前,它运行良好:

'NSInternalInconsistencyException',原因:'自动布局仍然 将 -viewDidLayoutSubviews 发送到视图控制器后需要。 ViewController 的实现需要发送 -layoutSubviews 到 视图调用自动布局。'

我对图形一无所知,我唯一能想到的就是输入[self.view layoutSubviews];,但这并没有解决任何问题。当我在情节提要中取消选中“自动布局”时它起作用了,但这改变了我的按钮的尺寸,我想知道是否有其他方法可以解决它?

代码:

-(void)viewDidLayoutSubviews {
    NSArray *arrayOfButtons = [NSArray arrayWithObjects:self.decimalButton, self.buttonOne, self.buttonTwo, self.buttonThree, nil];

    for (UIButton *button in arrayOfButtons) {

        [button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
        [button setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];

        button.layer.borderWidth = 0.25f;
        button.layer.borderColor = [[UIColor grayColor] CGColor];

        CAGradientLayer *btnGradient = [CAGradientLayer layer];
        btnGradient.frame = button.bounds;
        btnGradient.colors = [NSArray arrayWithObjects:
                              (id)[[UIColor colorWithRed:122.0f / 255.0f green:188.0f / 255.0f blue:255.0f / 255.0f alpha:1.0f] CGColor],
                              (id)[[UIColor colorWithRed:96.0f / 255.0f green:171.0f / 255.0f blue:248.0f / 255.0f alpha:1.0f] CGColor],
                              nil];
        [button.layer insertSublayer:btnGradient atIndex:0];
    }
}

【问题讨论】:

  • 打电话给[super viewDidLayoutSubviews]怎么样?文档说默认实现什么都不做,但值得一试。

标签: ios objective-c uibutton autolayout


【解决方案1】:

我最近遇到了这个问题,当时我想通过提供viewDidLayoutSubviews 消息处理程序以编程方式调整情节提要创建的视图的框架。按照异常消息中的说明,我尝试在-viewDidLayoutSubviews的末尾添加[self.view layoutIfNeeded],然后就成功了。

【讨论】:

  • 我很困惑为什么会这样。看起来这应该以无限递归结束,但事实并非如此。调用[self.view layoutSubviews] 后,viewDidLayoutSubviews 不会再被调用,以此类推?
  • 我的猜测是,有几次自动布局在此期间“稳定”,即它们逐渐被标记为满意或不满意,直到没有歧义。
  • 你救了我。我确信错误表明我们应该在 调用 super 实现之前显式调用 layoutSubviews
  • 这行得通,尽管我改为调用 [self.view layoutIfNeeded] 并且这也行得通——在文档中,它说永远不要直接调用 layoutSubviews。
  • 这似乎在iOS8上已修复,如果您将代码放入viewWillLayoutSubviews中也不会发生
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-16
  • 1970-01-01
  • 2012-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多