TL;DR:viewWillLayoutSubviews:
ビュー階層は、viewDidLayoutSubviews:
呼び出されるまで iPad Pro の画面サイズに合わせて調整されないようです。これがレイアウト システムによっていつ呼び出されるかは、ビュー階層の構築によって異なります。
iPad Pro 用にアプリを更新すると、同様の動作も見られます。したがって、ビュー コントローラーのライフサイクル イベントを詳しく調べて、既存のプロジェクトと新しいプロジェクトの両方で何が起こっているかを確認しました。
真新しいプロジェクトの場合、ナビゲーション バー (ステータス バーのすぐ下に配置) とプライマリ ビュー (残りのスペースを占有し、自動レイアウトをオンにして、横向きモード) のみを持つビュー コントローラーを使用すると、次のスクリーンショット:
View Controller ライフサイクルのコンソールから次の出力が表示されます。
-[ViewController viewDidLoad] self.navigationBar: .frame: {{0, 20}, {1024, 44}}; .bounds: {{0, 0}, {1024, 44}}
-[ViewController viewDidLoad] self.primaryView: .frame: {{0, 64}, {1024, 704}}; .bounds: {{0, 0}, {1024, 704}}
-[ViewController viewWillAppear:] self.navigationBar: .frame: {{0, 20}, {1024, 44}}; .bounds: {{0, 0}, {1024, 44}}
-[ViewController viewWillAppear:] self.primaryView: .frame: {{0, 64}, {1024, 704}}; .bounds: {{0, 0}, {1024, 704}}
-[ViewController viewWillLayoutSubviews] self.navigationBar: .frame: {{0, 20}, {1024, 44}}; .bounds: {{0, 0}, {1024, 44}}
-[ViewController viewWillLayoutSubviews] self.primaryView: .frame: {{0, 64}, {1024, 704}}; .bounds: {{0, 0}, {1024, 704}}
-[ViewController viewDidLayoutSubviews] self.navigationBar: .frame: {{0, 20}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}}
-[ViewController viewDidLayoutSubviews] self.primaryView: .frame: {{0, 64}, {1366, 960}}; .bounds: {{0, 0}, {1366, 960}}
-[ViewController viewDidAppear:] self.navigationBar: .frame: {{0, 20}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}}
-[ViewController viewDidAppear:] self.primaryView: .frame: {{0, 64}, {1366, 960}}; .bounds: {{0, 0}, {1366, 960}}
ここで確認できることから、ビューは 1024 ポイントの幅で開始されますが、「viewDidLayoutSubviews」が実行されると、適切なサイズ (1366 ポイント) が決定されます。
分割ビュー コントローラーを使用している 1 つの画面の自分のプロジェクトでは、同様の動作が見られます。
-[XYZViewController viewDidLoad] self.navigationBar: .frame: {{0, 20}, {1024, 44}}; .bounds: {{0, 0}, {1024, 44}}
-[XYZViewController viewWillLayoutSubviews] self.navigationBar: .frame: {{0, 20}, {1024, 44}}; .bounds: {{0, 0}, {1024, 44}}
-[XYZViewController viewDidLayoutSubviews] self.navigationBar: .frame: {{0, 0}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}}
-[XYZViewController viewWillLayoutSubviews] self.navigationBar: .frame: {{0, 0}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}}
-[XYZViewController viewDidLayoutSubviews] self.navigationBar: .frame: {{0, 0}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}}
-[XYZViewController viewWillAppear:] self.navigationBar: .frame: {{0, 0}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}}
-[XYZViewController viewWillLayoutSubviews] self.navigationBar: .frame: {{0, 0}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}}
-[XYZViewController viewDidLayoutSubviews] self.navigationBar: .frame: {{0, 20}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}}
-[XYZViewController viewWillLayoutSubviews] self.navigationBar: .frame: {{0, 20}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}}
-[XYZViewController viewDidLayoutSubviews] self.navigationBar: .frame: {{0, 20}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}}
-[XYZViewController viewDidAppear:] self.navigationBar: .frame: {{0, 20}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}}
この場合、ビュー階層が異なるため、viewWillLayoutSubviews:
はビュー コントローラーのライフサイクルの早い段階で呼び出され、正しいサイズは呼び出されるまでに既に決定されていviewWillAppear:
ます。しかし、ご覧のとおり、これは実際にはビュー階層に依存します。そのため、ビュー階層を確認してから、解像度に依存するコードを追加する最適な場所を決定することをお勧めします。