2013-03-19 81 views
26

我有类似的问题this poster。我用jrturton的建议将用于定制按钮的代码移动到viewDidLayoutSubviews。这是工作顺利,直到我收到此错误:自动布局错误

'NSInternalInconsistencyException', reason: 'Auto Layout still required after sending -viewDidLayoutSubviews to the view controller. ViewController's implementation needs to send -layoutSubviews to the view to invoke auto layout.'

我对图形很无能,我能想到的唯一的事情就是把[self.view layoutSubviews];但没有任何修复。当我在Storyboard中取消选中“自动布局”时,它工作正常,但这改变了我的按钮的尺寸,我想知道是否有另一种方法来解决它?

代码:

-(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]; 
    } 
} 
+1

怎么样调用'[super viewDidLayoutSubviews]'?文档说默认实现什么都不做,但值得一试。 – 2013-03-19 04:02:37

回答

66

我有这个问题,最近,当我想以编程方式调整由故事板创建的视图的框架,通过提供viewDidLayoutSubviews消息处理程序。按照异常消息的指示,我试图在-viewDidLayoutSubviews的末尾添加[self.view layoutIfNeeded],然后运行。

+4

我很困惑,为什么这个工程。看来这应该以无限递归结束,但事实并非如此。调用'[self.view layoutSubviews]'后,不会'viewDidLayoutSubviews'再次被调用,依此类推? – Snowman 2013-11-16 18:06:35

+2

我的猜测是,有几次通过,在此期间自动布局“解决”,即它们逐渐被标记为满意或不满足,直到没有任何歧义。 – 2014-01-10 19:01:34

+0

你救了我。我确信这个错误表明我们应该在调用'super'实现之前显式调用'layoutSubviews' *。 – user 2014-06-29 01:17:23