2

私のプロジェクトには本当に奇妙なバグがあります。私はUIScrollViewメインの大きなビューを持っています。その中に、インスタンス変数を持つUIViewController(not UITableViewController) とその他の があります。その上にタブバーがあるため、ビューコントローラーのビューフレームを に設定しました (これはまだ機能していません)。最初はうまく機能し、見栄えがしますが、を提示して閉じると(したがって、をリロードすると思います)、のビューが画面の上部にプッシュされます(デフォルトではに設定されていますが、設定したのでに、今は に設定します。UITableViewUIButtonsCGRectMake(0, 64, 320, 388)modalViewControllerUIViewControllerUIViewControllerCGRectMake(0, 0, 320, 460)wantsFullScreenLayoutNOCGRectMake(0, 0, 320, 388)

viewWillAppearこの問題をとの間のどこかに追跡しましたviewDidAppear。を閉じた後の正確なログは次のmodalViewControllerとおりです。

2011-05-06 11:08:39.974 Campus[1570:207] フレームは 0.000000、64.000000、320.000000、388.000000 (viewWillAppear)
2011-05-06 11:08:40.378 Campus[1570:200,007] フレームは 0.0.0 320.000000、388.000000 (viewDidAppear)

ご覧のとおり、フレームは では問題ありviewWillAppearませんが、 ではそうではありませんviewDidAppear

私はそれを修正するために次のことを行いました: - 、、、および
で目的のフレームを設定します。 - 私を に設定します。- メソッドのオーバーライドで自分と呼び出しを 殺しました。loadViewviewDidLoadviewWillAppearviewDidAppear
wantsFullScreenLayoutNO
[super viewWillAppear:][super viewDidAppear:]

私は何をすべきか?!?!?

4

1 に答える 1

0

ここでの問題は、iOS 4 の時点で、Apple がウィンドウごとに 1 つのビュー コントローラーしかサポートしていなかったことです。ただし、iOS 5 の時点で、Apple はコンテナー ビュー コントローラーのサポートを追加しUIViewControlleraddChildViewController:. コンテナー ビュー コントローラー アルゴリズムを使用すると、問題が解決しました。詳細については、UIViewController クラス リファレンスを参照してください。

編集:クラスリファレンスで「コンテナビューコントローラー」を検索するのが面倒な人のために、クラスリファレンスの関連セクションの要点を次に示します。

カスタム UIViewController サブクラスは、コンテナー ビュー コントローラーとしても機能します。コンテナー ビュー コントローラーは、所有する他のビュー コントローラー (子ビュー コントローラーとも呼ばれる) のコンテンツの表示を管理します。子のビューはそのまま表示することも、コンテナ ビュー コントローラーが所有するビューと組み合わせて表示することもできます。

コンテナ ビュー コントローラ サブクラスは、その子を関連付けるためにパブリック インターフェイスを宣言する必要があります。これらのメソッドの性質はユーザー次第であり、作成しているコンテナーのセマンティクスによって異なります。ビュー コントローラーで一度に表示できる子の数、それらの子が表示されるタイミング、およびビュー コントローラーのビュー階層内のどこに表示されるかを決定する必要があります。ビュー コントローラ クラスは、子によって共有されるリレーションシップ (存在する場合) を定義します。コンテナーのクリーンなパブリック インターフェイスを確立することで、コンテナーが動作を実装する方法に関する多くのプライベートな詳細にアクセスすることなく、子がその機能を論理的に使用できるようになります。

コンテナ ビュー コントローラは、子のルート ビューをビュー階層に追加する前に、子ビュー コントローラをそれ自体に関連付ける必要があります。これにより、iOS はイベントを子ビュー コントローラーとそれらのコントローラーが管理するビューに適切にルーティングできます。同様に、ビュー階層から子のルート ビューを削除した後、その子ビュー コントローラーをそれ自体から切断する必要があります。これらの関連付けを作成または解除するために、コンテナーは基本クラスで定義された特定のメソッドを呼び出します。これらのメソッドは、コンテナ クラスのクライアントによって呼び出されることを意図していません。それらは、期待される封じ込め動作を提供するために、コンテナーの実装によってのみ使用されます。

于 2011-11-18T16:25:46.920 に答える