3

2つの子ビューコントローラー(AとB)があり、両方に。が追加されたコンテナービューコントローラーについて考えてみますaddChildViewController:。それで:

  1. A.viewコンテナビューに追加されます
  2. transitionFromViewControllerBはAからBまで行うことで表示されます。Bは受け取りviewWillLayoutSubviews、すべてが世界に良いです。
  3. willRotateToInterfaceOrientation:デバイスはBを表示しながら回転します。回転呼び出し(およびすべて)を受信するのはBのみです。
  4. transitionFromViewControllerAはBからAまで行うことで表示されます。Aは受信しないviewWillLayoutSubviewsため、レイアウトが壊れています。

これは予想される動作ですか?そうでない場合、私は何を間違っている可能性がありますか?はいの場合、Bを表示しているときに回転の変化をAに通知するにはどうすればよいですか?

4

3 に答える 3

5

電話をかけるとすぐにaddChildViewController:、View ControllerContainerImplementerになります。これは、のような標準のプレゼンテーション呼び出しよりも少し多くの作業を行う必要があることを意味しますpresentViewController..。これには、あなたの質問があなたが期待したかもしれないことを示唆しているように、あなたが子供として追加するコントローラーのビューのフレームを扱うことを含みます。

たとえば、各子をフルスクリーンで表示するだけの非常に基本的なサンプルコンテナを実装するには、次のようにします。

-(void)swapChildVCFrom:(UIViewController *)from to:(UIViewController *)to{
    [self addChildViewController:to];
    [from willMoveToParentViewController:nil];

    // Adjust the new child view controller's view's frame
    // For example here just set it to fill the parent view
    to.view.frame = self.view.bounds;

    [self transitionFromViewController:from
                      toViewController:to
                              duration:1.0
                               options:UIViewAnimationOptionTransitionFlipFromLeft
                            animations:nil
                            completion:^(BOOL b){
                                [to didMoveToParentViewController:self];
                                [from.view removeFromSuperview];
                                [from removeFromParentViewController];
                            }];
}
于 2012-11-17T23:20:34.320 に答える
1

Aロードされて表示された後、の境界が変更viewWillLayoutSubviewsされない限り、は再度呼び出されません。A.viewビューが画面に表示されるたびに実装を実行する必要がある場合は、そのコードをに移動してみてくださいviewWillAppear

于 2012-11-17T19:26:13.483 に答える
1

私が考えることができる3つの解決策があります:

  1. コンテナのすべてのビューコントローラを前もって追加し、それらのビューを追加しますが、最初のビューを除くすべてを非表示にします。次に、View Controller間を移行するメソッドでは、無数の包含関連メソッドについて心配する必要はありません(たとえば、、、、、または)は必要ありませんがwillMoveToParentViewController、表示または非表示にするオプションを使用するだけです。適切なビュー。このようにして、すべてのコントローラーがすべてのローテーション通知を受け取ります。addChildViewControllerremoveFromParentViewControllerdidMoveToParentViewControllerUIViewAnimationOptionShowHideTransitionViews

  2. 2番目の論理的な代替手段は、最初のViewControllerのみを事前に作成することです。次に、2番目のView Controllerに移行する場合にのみ、それを作成します(そしてそのビューです)。また、元のコントローラーへの強い参照を保持しないようにしてください(たとえば、独自のプロパティだけでなく、必ず確認してくださいremoveFromParentViewControllerなど)。それにより、それとその見解の割り当てが解除されます。したがって、元に戻ると、再作成されます。

  3. ビューコントローラを前もって作成しているが、それぞれのビューをコンテナに追加および削除できる場合は、外観と回転のコールバック動作のカスタマイズtransitionFromViewControllerで説明されているように、適切な子回転イベントを呼び出す必要があると思います。『View Controllerプログラミングガイド』を参照してください。

于 2012-11-17T19:33:54.367 に答える