2013-03-19 5 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];を置くためにそれは何も解決しませんでした:私はこのエラーを受信するまで、それはうまく働いていました。私のストーリーボードで「自動レイアウト」のチェックを外すと機能しましたが、それはボタンの大きさを変えました。それを修正する別の方法があるのだろうかと思いました。

コード:

-(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]'を呼び出すのはどうですか?ドキュメントは、デフォルトの実装は何もしませんが、試してみる価値があると言います。 –

答えて

66

私はプログラム的viewDidLayoutSubviewsメッセージハンドラを提供することで、ストーリーボードで作成されたビューのフレームを調整したいとき、私は、最近、この問題を持っていました。例外メッセージの指示に従って、-viewDidLayoutSubviewsの末尾に[self.view layoutIfNeeded]を追加しようとしました。

+4

これがなぜ機能するのか混乱しています。これは無限再帰で終わるはずですが、そうではありません。 '[self.view layoutSubviews]'を呼び出した後、 'viewDidLayoutSubviews'がもう一度呼び出されることはありませんか? – Snowman

+2

私の推測では、自動レイアウトが「解決」している間にいくつかのパスがある、つまり、曖昧さがなくなるまで、満足するかどうかを徐々にマークしていると思います。 –

+0

あなたは私を救った。私はエラーが、 'super'実装への呼び出しの前に' layoutSubviews' *を明示的に呼び出さなければならないことを示していると確信しました。 – user

関連する問題