アップデート:
元の質問を誤解している可能性があることに気づきました。しかし、質問に正しく答えるには、あなたの言っていることを明確にする必要があります。だから、あなたは言った:
A という UIViewController があります。A の中に、B という名前の別の UIViewController を追加しました。また、A に別の UIViewController を追加しています。それを C と呼びましょう。
つまり、本質的に、あなたは次のことをしましたか?
[A addChildViewController:B];
[B didMoveToParentViewController:A];
[A addChildViewController:C];
[C didMoveToParentViewController:A];
私はそれを正しく理解しましたか?とにかく、あなたは言い続けます:
私が抱えている問題は、C が存在しない場合 (つまり、A のビュー コントローラーに追加されていない場合)、回転によって適切なサイズが得られることです。
addChildViewController:C
それで、すべてが大丈夫だと言ったことは一度もなかったと言っているのですか?あなたは続けます:
...しかし、CがAに追加されると、UIViewControllerのBは正しいフレーム調整を受け取りませんでした。
つまり、 を呼び出しaddChildViewController:C
てtransitionFromViewController:B toViewController:C
? しかし、その場合、B は回転イベントをまったく取得しません。B.view.frame.size
B から C にいつ移行したかについて言及するのは、私には意味がありません。とにかく、これが私の最初の回答の基礎でした。次のシナリオについて話しているに違いないと仮定します。
- B & C は , を介して追加され
addChildViewController
ます
- B は、縦向きの状態で最初にアクティブになります。
- あなた
transitionFromViewController:B toViewController:C
、
- デバイスを横向きに回転すると、C は回転イベントを取得しますが、B は取得しません。
- Bに
transitionFromViewController
戻ると、ビュー コントローラー B は などの外観関連のメソッドを受け取りますviewWillAppear
が、C がアクティブである間に回転イベントを見逃してしまいます。
したがって、このシナリオで B がローテーション ベースのロジックをチェックする必要がある場合は、B のようなメソッドの実行中にそれを行う必要がありますviewWillAppear
(ただし、親ビュー コントローラー A が実行後に別の何かを明示的に呼び出す場合を除きますtransitionFromViewController:C toViewController:B
)。しかし、おそらく回転イベントの有無は気にしていないのではなく、フレームをチェックすると奇妙な結果が得られることに気付きました。しかし、あなたが説明しているシナリオをよく理解していないので、残りの質問を続けましょう.
それで、あなたは言い続けます:
基本的に、B の willAnimateToInterfaceRotation で回転すると、向きに関係なくフレームは同じままです。B が縦向きで、サイズが 768 x 1004 だとします。
わかりました、私たちはそこで良いと思います。あなたは続けます:
次に、C を A に追加するボタンがあります (C は B の前にあります)。
あなたがしたと言っていますtransitionFromViewController:B toViewController:C
か?「B の前」という用語は、ビュー コントローラーのコンテインメントのコンテキストでは意味がありません。C は B の前に移動しません。B から C に移行します。
回転すると、フレームのサイズが768x1004で印刷されます。
それは変だ。しかし、もっと重要なのは、「768x1004」とは何ですか? C.view.frame.size
? B から C に移行した場合、 を参照しても意味がないと思いますB.view.frame.size
。「768x1004」を報告していると言っていることがわかりません。
とにかく、あなたは続けます:
ただし、Cを却下すると(つまり、親のView Controller、この場合はAから削除します)。回転するとそれに応じてフレームの幅が変わります。
「親のView Controllerから削除する」と言うとき、私はあなたが持っていることを意味すると思います:
- 呼び出された
transitionFromViewController:C toViewController:B
- で消えると C に警告した
[C willMoveToParentViewController:nil]
- そしてそれを削除しました
[C removeFromParentViewController];
上記の私の解釈(または誤解)に関する元の質問を明確にしていただければ、あなたが何をしているのか正確にわかりますか? フレームサイズに関してコンテナで奇妙なものを見たことは確かですが、最初にあなたの質問を理解していることを確認したいと思います.
オリジナル:
を参照してくださいautomaticallyForwardAppearanceAndRotationMethodsToChildViewControllers
。マジで、誰がそのメソッド名を思いついたの?!?
しかし、それはメソッドを非アクティブなView Controllerに送信しません。子コントローラーの向きを確認する必要があるようですviewWillAppear
。
すべてのコントローラーを前もってロードするのではなく、ジャスト イン タイムで実行すると (タブ ビュー コントローラーのようなもの)、この問題は解消されます。