2013-03-19 89 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