Autolayoutされた後の座標を調べるのはviewDidLayoutSubviews内で

Xcode 5.1.1

少し前に書いたStoryboardでAutolayoutに関する補足。

Autolayoutが登場する以前のViewの初期座標設定というのは、UIViewController#viewDidLoadで行っていた。Autolayoutが主流になりつつある最近であっても、すべてのViewの座標をすべてAutolayoutで定義するというのはなかなか難しい。(できなくはない)

おおまかなレイアウトだけStoryboard上でAutolayoutで定義した上で、実行時にプログラム内で動的に座標計算を行い、Viewのframeプロパティを使ってサブビューを構成したいという場合もあるだろう。そういった場合、Autolayoutで定義されたビューの絶対座標(UIView#frame)を調べるには、ViewController#viewDidLoadではなく、UIViewController#viewDidLayoutSubviews内で調べること。

たとえば、前回の画面中央部のメインコンテンツのビューは、3.5インチデバイスで表示したときに、viewDidLoad内でframeの高さを調べると、4インチの高さで取得されてしまう。viewDidLayoutSubviews内ではきちんと、3.5インチデバイスとしての高さが取得できる。