2

ストーリーボードを使用する場合viewWillAppear、サブビューを描画せずviewDidLayoutSubviews、さらに重要なことに、内部でframe.size呼び出す必要があるサブビューのサブビューから値にアクセスするのはなぜですか? ビュー コントローラーのページ ライフ サイクルと、xibs からストーリーボードへの変更で何が変わったのかを理解することに興味があります。[self.scroller layoutIfNeeded]viewDidLayoutSubviews

ビュー階層のスクリーンショット

4

1 に答える 1

2

ストーリーボードは、実際には xib ファイルのコレクションとして実装され、それらの間の遷移 (セグエ) に関する追加情報が含まれています。したがって、単一のビュー コントローラーについて話しているだけの場合、ビュー コントローラーのライフ サイクルが根本的に異なることはありません。

ビューコントローラーとそのビュー階層がどのように設定されているかを理解せずに、特定の質問に答えることは非常に困難です。frameスクロール ビュー内にビューがあり、いつそのプロパティにアクセスできるかを知りたいと思われます。

UIKit は次の手順に従います (大まかに):

  1. ストーリーボード/xib ファイルに記述されているすべてのビューを読み込み、必要に応じてすべてのアクションとアウトレットを接続します。viewDidLoadこのステップの後に呼び出されます。
  2. viewWillAppear:ビューを表示しようとしていることを示すために呼び出します。
  3. ビューをウィンドウに追加し、サイズを合わせます。サイズ変更はビュー階層を下に伝播するため、各ビューはそのサブビューをレイアウトします (サブビューのサイズを自動変更するように構成されている場合)。これらの変更はアニメーション ブロック内で発生するため、すべての設定が完了すると、新しいビューがアニメーション化されて配置されます。
  4. アニメーションが完了すると、viewDidAppear:が呼び出されます。

ビューが;にautoresizesSubviews設定されている場合、何かおかしくなっている可能性があります。それがあなたが電話しNOなければならない理由かもしれません。のドキュメントには次のように記載されていることに注意してください。layoutIfNeededself.scrollerlayoutIfNeeded

このメッセージが受信されると、レイアウトを必要としない祖先レイヤーが見つかるまで、レイヤーのスーパー レイヤーが走査されます。次に、その祖先の下にあるレイヤー ツリー全体に対してレイアウトが実行されます。

したがって、他の無関係なビューのレイアウトをトリガーする可能性があります。

于 2013-01-11T20:44:01.760 に答える