28

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 で新しいイニシャライザ メソッドを指定する (したがって、フレーム プロパティを指定する) か。それとも、何かが足りないのでしょうか。他の可能性はありますか?

4

3 に答える 3

8

指定された初期化子使用する必要はありません。のように init を使用するだけ[[UIView alloc] init]です。指定された初期化子は、サブクラスの初期化子から使用する必要があります。

一方、フレームを 2 回設定しても大きな害はありません。で多くのタスクを実行するsetFrame:ことは異常です。レイアウトは通常 で行われlayoutSubviews、一度だけ実行されます。

于 2009-07-09T11:35:11.690 に答える
0

私は現在、 UIViewController からサブクラス化して汎用コンポーネントを作成した後、同じことを達成しようとしていますが、非常に奇妙なことに気づきました:

UIViewController には、オーバーライドできる「loadView」メソッドがあります(ドキュメントを引用)「これは、サブクラスがカスタムビュー階層を作成する場所です」。

そのため、ビュー階層を作成し、デフォルトのフレーム サイズを使用して画面を合成します (loadView が呼び出されたときに表示する必要のあるフレームがわからない可能性があるため)。

しかし、その後、どの呼び出しでフレームサイズを正しく設定しますか? 別名:ビューコントローラーはいつビューの実際のサイズを認識しますか?

ViewController サブクラスで、ViewController を作成するオブジェクトが呼び出す「setFrame」を作成する必要がありますか? それは奇妙に思えます。

drvdijk: 問題の解決策はありましたか?

編集: UIViewController ドキュメントに関するこの注を見つけました: 注: ビュー コントローラを使用して、ウィンドウの一部のみ、つまり、アプリケーション コンテンツの四角形によって定義された領域の一部のみを埋めるビューを管理しないでください。いくつかの小さなビューで構成されたインターフェイスが必要な場合は、それらすべてを単一のルート ビューに埋め込み、ビュー コントローラーでそのビューを管理します。

そのため、UIViewController のメイン ビューは常に全画面表示になっているようです。限目。

ただし、カスタム UITabBarViewController を作成しようとしているので(青のグラデーションではなく、タブバーにカスタム画像を表示できるようにするため)、問題が発生します。私の tabBarViewController は、ウィンドウの一部にサブビューコントローラーを表示する必要があります。 ..

于 2009-12-23T18:06:11.113 に答える
0

利用可能な画面スペースの境界を計算したい場合があります (これは、ナビゲーション バー、タブ バー、ステータス バーなどの他のビューの存在に依存します)。[[UIView alloc] initWithFrame:]これらの境界は、loadViewのフレーム パラメータに使用できます。

これが必要な場合は、私の答えが役立つかもしれません: LoadView で正しいサイズを決定する

于 2013-03-20T17:23:05.057 に答える