View Controllerのライフサイクルについては、View Controller Programming Guide for iOSで説明されています。
つまり、-view
が初めて呼び出されたときに、-viewDidLoad
が呼び出されます。ビュー コントローラーがビューに対して行う最初の処理がフレームの設定であっても、ビューにアクセスする必要があります。
UIViewController *controller = [MyViewController myViewController];
// -viewDidLoad has not been called (if +myViewController doesn't call -view.)
UIView *view = [controller view];
// -viewDidLoad has been called.
view.frame = [UIApplication sharedApplication].delegate.window.bounds;
controller.view.frame
同じ論理シーケンスを使用しても発生します。-viewDidLoad
ビュー階層に埋め込まれていない、新たに逆シリアル化されたビューで常に呼び出されます。
アップデート
以前は明確ではありませんでしたが、 でビューの境界が正しく設定されていない理由を指摘していました-viewDidLoad
。-viewDidLoad
ビューコントローラーのビューがビュー階層に追加された後でのみです。これは、ビューの最終フレームが設定されるときです。
フレームを適切な寸法にする必要がある場合は、IB を使用して必要な寸法を設定するか、(IB を使用しない場合) でフレームを設定し-loadView
ます。このアプローチは、フレームのサイズを呼び出し後に変更できる値に静的に設定するため、欠陥があります-viewDidLoad
(通話中のステータス バーなど)。
更新 2
サブビューの追加を、配置およびサイズ変更のサブビューから分割する必要があります。
ストーリーボードまたは Nib からロードしている場合は正しいです。必要な追加のビューを に追加する必要があります-viewDidLoad
。プログラムでロードしている場合、すべてのサブビューが に追加され-loadView
ます。
2 番目のタスクは、サブビューの配置とサイズ変更です。推奨される方法はUIView.autoresizingMaskを使用することですが、より正確なレイアウトを行うには、KVO view.bounds を使用し、ビュー コントローラーのビューのサイズが変更されたときにカスタム サブビューを調整します。