iOS
AutoLayout

[iOS]viewDidLayoutSubviewsの最後にはlayoutSubviewsを呼び出そう

More than 3 years have passed since last update.


症状

iOSアプリを開発していて、iPhoneシミュレータだとエラーもなく動くのに、実機で動かすとエラーがでた。

エラーの内容は、

Assertion failure in -[UIView layoutSublayersOfLayer:], …

を含むのは共通しているが、その後に続くエラーは様々のようだ。


解決策

これらのエラーは下記コードのように、ViewControllerのviewDidLayoutSubviewsメソッドの最後に、[self.view layoutSubviews]を呼び出すと実機でエラーなく実行できるようになる。

[self.view layoutSubivews]は必ず最後でなければならない。途中で呼び出してもエラーのままである(実体験)。


追記:

[self.view layoutSubview]よりも[self.view layoutIfNeeded]のほうが良さそうなので修正しました。

情報をいただいたtomohisaotaさん、pebble8888@githubさん、usatieさん、ありがとうございました。


-(void)viewDidLayoutSubviews {

[super viewDidLayoutSubviews];

// レイアウトなどをいろいろいじる
// …

[self.view layoutIfNeeded]; // <- これが重要!
}


参考: http://stackoverflow.com/questions/18429728/autolayout-and-subviews