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

このエントリーをはてなブックマークに追加
はてなブックマーク - [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は決定しています。

Comments

comments

Powered by Facebook Comments

2 comments

  1. Pingback: UIScrollViewのContentSizeを設定しても動かない…。AutoLayoutとUIScrollViewを併用する方法。 | イリテク株式会社
  2. Pingback: UIScrollViewのContentSizeを設定しても動かない…。AutoLayoutとUIScrollViewを併用する方法。 | イリテク

Post a comment

You may use the following HTML:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">