[iOS6] AutoLayoutを使用すると、viewWillAppear: でframeが決定しないので注意

iOS6のサンプルプロジェクトを使ってて挙動が違ったのでメモ。iOS5までのAutoResizingの場合、viewDidLoad時は正しいサイズがかえってこないという現象がありました。viewDidLoad後に、ツールバーのサイズなどを含めてAutoResizingを行うためです。AutoLayoutの場合、viewWillAppear後に、viewの位置決定が行われるようです。

- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@" viewDidLoad %@",NSStringFromCGRect(self.scrollView.frame));
}

- (void) viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
NSLog(@" viewWillAppear %@",NSStringFromCGRect(self.scrollView.frame));
}
- (void) viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
NSLog(@" viewDidLayoutSubviews %@",NSStringFromCGRect(self.scrollView.frame));
}

上のようなコードを書いて、スクロールビューを全画面にしたビューで実行すると、AutoResizingの場合、

2012-11-13 14:31:14.232 RefreshControlSample[144:707] viewDidLoad {{0, 0}, {320, 460}}
2012-11-13 14:31:14.237 RefreshControlSample[144:707] viewWillAppear {{0, 0}, {320, 416}}
2012-11-13 14:31:14.263 RefreshControlSample[144:707] viewDidLayoutSubviews {{0, 0}, {320, 416}}

と、ViewWillAppearで、最終のサイズが取得されます。このプロジェクトをAutoLayoutに変えて実行すると、

2012-11-13 14:37:56.426 RefreshControlSample[23480:907] viewDidLoad {{0, 0}, {0, 0}}
2012-11-13 14:37:56.428 RefreshControlSample[23480:907] viewWillAppear {{0, 0}, {0, 0}}
2012-11-13 14:37:56.464 RefreshControlSample[23480:907] viewDidLayoutSubviews {{0, 0}, {320, 504}}

と、viewWillAppearでは、サイズが0,0のままで、viewDidLayoutSubviewsでただしくレイアウトされました。
ですから、ScrollViewなどで、自分のサイズをもとにレイアウトする用途の場合、viewDidLayoutSubviews内で、レイアウトするのが正しいですね。AutoLayoutは、iOS5ではどちらにしろ動かないので、AutoLayoutを使う際は、viewDidLayoutSubviewsでレイアウト後の作業をまとめてかけますね。

追記: iOS6でも、AutoResizingを使用している場合は、viewWillAppearでframeは決定しています。

「[iOS6] AutoLayoutを使用すると、viewWillAppear: でframeが決定しないので注意」への2件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください