2

ビューコントローラ(mainVC)を押して、それにいくつかのサブビューを追加します。これらのビューのほとんどは、ユーザーが何らかのアクションを実行するため、オンデマンドで構築されます。

各ビューを作成するときはmainVC.view.bounds、ビューのサイズを参照します。オンデマンドサイズで構築されたものは問題ありませんが、最初のもの(私が追加したものviewDidLoad)は、非表示のナビゲーションバーまたは非表示のツールバーのどちらも考慮していないようです-どちらかはわかりません。

他の質問は、viewDidLoadが境界を参照し、これらのサブビューを追加するための正しい場所であることを私に保証しているようです。私は誤った情報を持っていますか?ロギングにより、次の結果が得られます。

境界の高さはviewDidLoad548です。

境界の高さはviewWillAppear460(-44 x 2)です。でナビゲーションバーを非表示にしましviewWillAppearたが、高さは前後で同じです。

それ以降のすべての時点で、境界の高さは504(-44 x 1)です。

読み込もうとするまでに境界の高さが更新されないのはなぜviewDidLoadですか?

4

1 に答える 1

5

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 を使用し、ビュー コントローラーのビューのサイズが変更されたときにカスタム サブビューを調整します。

于 2012-10-02T00:59:38.140 に答える