自动布局错误

stu*_*ped 26 objective-c uibutton ios autolayout

我对这张海报有类似的问题.我使用了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];
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 66

我最近遇到了这个问题,当时我想通过提供viewDidLayoutSubviews消息处理程序以编程方式调整故事板创建的视图的框架.按照异常消息的指示,我试着[self.view layoutIfNeeded]在最后添加-viewDidLayoutSubviews,然后它工作.

  • 这是有效的,虽然我调用[self.view layoutIfNeeded]而且也有效 - 在文档中,它表示永远不会直接调用layoutSubviews. (21认同)
  • 这似乎是在iOS8上修复的,如果将代码放入viewWillLayoutSubviews中也不会发生这种情况 (6认同)
  • 我很困惑为什么这样做.看起来这应该以无限递归结束,但事实并非如此.在调用`[self.view layoutSubviews]`之后,不会再次调用`viewDidLayoutSubviews`,依此类推? (4认同)
  • 我的猜测是,有几次传递,在此期间自动布局"稳定",即它们逐渐被标记为满意或不存在,直到不存在歧义. (2认同)