UIViewController概要:ビューを初期化するときに、UIView インスタンスのサイズをどのように知る必要がありますか?
UIView 専用の初期化メソッドはinitWithFrame:(CGRect)frameメソッドです。これにより、新しく作成された UIView のフレームが設定されます。このメソッドはUIViewController's、そのビュー コントローラーのビューが要求された場合、loadView メソッドから呼び出すことができます。UIViewControllerサブクラス化とビュー サイズに関する状態のドキュメント:
ビュー階層のビューを作成するときは、常にビューの自動サイズ変更プロパティを設定する必要があります。ビュー コントローラーが画面に表示されると、通常、そのルート ビューは使用可能なスペースに合わせてサイズ変更されます。これは、ウィンドウの現在の向きや、ステータス バーなどの他のインターフェイス要素の存在によって異なります。
したがって、UIViewControllerインスタンスはこれらのプロパティを設定する必要があります。これまでのところ、UIViewControllerそのビューがどれほど大きいか、またはこれから大きくなるかを知る必要はありません。
a のビューUIViewControllerが要求され、view プロパティが nil の場合、View Controller の loadView メソッドが呼び出されます。を初期化する必要があるため、問題が発生しましたUIViewが、View Controller はまだビューのサイズを認識していません。そのビューをどのくらいの大きさで初期化する必要がありますか? ビューのサイズはコードのどこで決定しますか?
ビューをゼロ四角形 ( CGRectZero)で初期化できます。
- (void)loadView {
self.view = [[[UIView alloc] initWithFrame:CGRectZero] autorelease];
}
そして、呼び出し元に次のようにビュー フレームを設定させます。
UIViewController *viewController = [[MyUIViewController alloc] init];
// next two lines are normally combined, but for clarity they are not now
UIView *view = viewController.view;
view.frame = CGRectMake(0, 0, 200, 200);
これはビュー コントローラ (viewController.view) からビューを要求し、そのビューを loadView メソッドでロードします。この loadView メソッドは、ビューをCGRectZero. 次に、呼び出し元がそのフレームを設定します (view.frame = ...)
UIView問題は、ビューのフレーム プロパティが 2 回設定されていることです。カスタムが setFrame メソッドで高度なレイアウトを行っている場合 (たとえば、サブビューの配置とサイズ変更)、さらに二重の作業が発生する可能性があります。UIViewControllerivar に保存する CGRect を呼び出し元に要求する専用の初期化メソッドを作成することで、これを防ぐことができます。loadView メソッドが呼び出された時点で、この ivar を使用してビューを作成します。
ここに行く良い方法は何ですか?ビューのフレームを 2 回設定する (で初期化してCGRectZeroから設定する) かUIViewController、CGRect で新しいイニシャライザ メソッドを指定する (したがって、フレーム プロパティを指定する) か。それとも、何かが足りないのでしょうか。他の可能性はありますか?