2012-11-17 83 views
3

考虑带有两个子视图控制器(A和B)的容器视图控制器,两者都添加了addChildViewController:。然后:iOS中的视图控制器与旋转之间的转换

  1. A.view被添加到容器视图
  2. B由操作的方式从A到transitionFromViewController B.乙显示接收viewWillLayoutSubviews和所有良好与世界。
  3. 设备在显示B时旋转。只有B收到旋转呼叫(willRotateToInterfaceOrientation:等)。
  4. 通过从B到A执行transitionFromViewController来显示A.A没有收到viewWillLayoutSubviews,因此布局被破坏。

这是预期的行为?如果不是,我可能会做错什么?如果是,在显示B时应该怎么做才能通知A轮换的变化?

回答

5

只要你拨打addChildViewController:你现在是一个视图控制器容器实施者。这意味着你必须做一些比标准演示电话如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]; 
          }]; 
} 
1

A已被加载并显示之后,viewWillLayoutSubviews将不会被再次调用,除非A.view的边界发生变化。如果您需要在屏幕上显示视图时运行实施,则可以尝试将该代码移动到viewWillAppear

+0

在调用'transitionFromViewController'之前更新下一个视图控制器视图的框架不是更合适吗?奇怪,但。我认为这将由容器视图控制器以某种方式处理,因为这是一个相当常见的情况。 – hpique

+0

@hpique由于'A.view'不旋转,其边界永远不会改变。因此,它应该只在第一次加载时才接收一次'viewWillLayoutSubviews'。 – Garrett

1

有三种解决方案,我能想到的:

  1. 添加所有的容器的视图控制器的前面,并加入自己的意见,但隐藏所有,但第一个。然后在视图控制器之间转换的方法中,您不必再担心无数的包含相关方法(例如,您不需要willMoveToParentViewControlleraddChildViewController,removeFromParentViewControllerdidMoveToParentViewController),而只需使用UIViewAnimationOptionShowHideTransitionViews选项即可将显示或隐藏适当的视图。这样,所有的控制器都可以获得所有轮换通知。

  2. 第二个逻辑替代方案是预先创建第一个视图控制器。然后,当你想转换到第二个视图控制器时,只有这样你才能创建它(和它的视图)。并确保你不要对原始控制器保持强烈的参照(例如,不只是你自己的属性,但要确保removeFromParentViewController等)。这将让它,它的意见,被释放。因此,当您转换回来时,它将被重新创建。

  3. 如果您在前面创建视图控制器,但让transitionFromViewController向您的容器添加和删除它们各自的视图,那么我认为您可能必须调用适当的子轮换事件,如在视图控制器编程指南中的Customizing Appearance and Rotation Callback Behavior

+0

+1表示不同的选项。谢谢! – hpique