ストーリーボードを使用する場合viewWillAppear
、サブビューを描画せずviewDidLayoutSubviews
、さらに重要なことに、内部でframe.size
呼び出す必要があるサブビューのサブビューから値にアクセスするのはなぜですか? ビュー コントローラーのページ ライフ サイクルと、xibs からストーリーボードへの変更で何が変わったのかを理解することに興味があります。[self.scroller layoutIfNeeded]
viewDidLayoutSubviews
1 に答える
ストーリーボードは、実際には xib ファイルのコレクションとして実装され、それらの間の遷移 (セグエ) に関する追加情報が含まれています。したがって、単一のビュー コントローラーについて話しているだけの場合、ビュー コントローラーのライフ サイクルが根本的に異なることはありません。
ビューコントローラーとそのビュー階層がどのように設定されているかを理解せずに、特定の質問に答えることは非常に困難です。frame
スクロール ビュー内にビューがあり、いつそのプロパティにアクセスできるかを知りたいと思われます。
UIKit は次の手順に従います (大まかに):
- ストーリーボード/xib ファイルに記述されているすべてのビューを読み込み、必要に応じてすべてのアクションとアウトレットを接続します。
viewDidLoad
このステップの後に呼び出されます。 viewWillAppear:
ビューを表示しようとしていることを示すために呼び出します。- ビューをウィンドウに追加し、サイズを合わせます。サイズ変更はビュー階層を下に伝播するため、各ビューはそのサブビューをレイアウトします (サブビューのサイズを自動変更するように構成されている場合)。これらの変更はアニメーション ブロック内で発生するため、すべての設定が完了すると、新しいビューがアニメーション化されて配置されます。
- アニメーションが完了すると、
viewDidAppear:
が呼び出されます。
ビューが;にautoresizesSubviews
設定されている場合、何かおかしくなっている可能性があります。それがあなたが電話しNO
なければならない理由かもしれません。のドキュメントには次のように記載されていることに注意してください。layoutIfNeeded
self.scroller
layoutIfNeeded
このメッセージが受信されると、レイアウトを必要としない祖先レイヤーが見つかるまで、レイヤーのスーパー レイヤーが走査されます。次に、その祖先の下にあるレイヤー ツリー全体に対してレイアウトが実行されます。
したがって、他の無関係なビューのレイアウトをトリガーする可能性があります。