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 メソッドで高度なレイアウトを行っている場合 (たとえば、サブビューの配置とサイズ変更)、さらに二重の作業が発生する可能性があります。UIViewController
ivar に保存する CGRect を呼び出し元に要求する専用の初期化メソッドを作成することで、これを防ぐことができます。loadView メソッドが呼び出された時点で、この ivar を使用してビューを作成します。
ここに行く良い方法は何ですか?ビューのフレームを 2 回設定する (で初期化してCGRectZero
から設定する) かUIViewController
、CGRect で新しいイニシャライザ メソッドを指定する (したがって、フレーム プロパティを指定する) か。それとも、何かが足りないのでしょうか。他の可能性はありますか?