iPhone如何在响应设备旋转时显示不同的视图控制器?

时间:2013-05-22 13:38:45

标签: ios uiviewcontroller uiinterfaceorientation autorotate

我注意到大多数消费者友好的Android和iPhone健身应用程序都有两种界面模式 - 在纵向模式下,用户可以获得更详细的信息,但当用户将设备转为横向模式时,会添加一个全屏图形覆盖整个屏幕。

我对如何在iPhone上响应设备轮换实现向不同视图控制器的转换感兴趣。我最初的想法是拦截(willRotateToInterfaceOrientation事件,然后获取应用委托并添加一个全屏图形视图控制器到窗口)。

有没有更好的方法将iPhone旋转转换为转换到另一个视图控制器?喜欢隐藏状态栏并使用动画在横向模式下推动模态视图控制器吗?

3 个答案:

答案 0 :(得分:3)

首先问问自己是否真的需要一个单独的视图控制器。一个视图控制器可以轻松隐藏或取消隐藏图形。 如果此图需要自己的视图控制器,那么您可以使用包含引用其自己的视图控制器的图的容器视图。这就是容器视图的用途。 然后,“主”视图控制器将隐藏和取消隐藏容器视图以响应旋转事件(并相应地布局它们等.pp。)

如果您希望在其超级视图中添加或删除容器视图(很可能是从“主”视图控制器的角度看自我视图),那么请执行此操作而不是隐藏和取消隐藏。这可能是最合适的。

无论您是在标签栏驱动的应用程序还是单个视图中,无论旋转的视图控制器是以模态方式推送还是呈现,无论您使用的导航结构如何,它都可以正常工作。应用程序,无论您是使用故事板,还是使用IB以及编程等,pp。

从应用程序的委托中获取窗口实例没有任何问题。我只是觉得不需要这样做。与替代方案相比,我看起来相当复杂。

答案 1 :(得分:1)

willRotateToInterfaceOrientation方法效果很好。

除了切换视图外,您可能还想要做的其他两件有用的事情是:

1)隐藏/显示状态栏。 (我喜欢隐藏在风景中)

[[UIApplication sharedApplication] setStatusBarHidden:UIInterfaceOrientationIsLandscape(toInterfaceOrientation)  withAnimation:UIStatusBarAnimationSlide];

2)隐藏/显示任何UINavigationBar。 (也许您的景观视图将受益于额外的高度)

[self.navigationController setNavigationBarHidden:UIInterfaceOrientationIsLandscape(toInterfaceOrientation) animated:YES];

答案 2 :(得分:0)

你可以有一个具有willRotateToInterfaceOrientation方法的视图控制器,并且该视图控制器还有另外两个视图控制器作为变量。

设备旋转后,您可以切换viewcontrollers的视图(非常粗略的代码示例:)

-(void)willRotateToInterfaceOrientation: (UIInterfaceOrientation)orientation duration:(NSTimeInterval)duration {

if ((orientation == UIInterfaceOrientationLandscapeLeft) || (orientation == UIInterfaceOrientationLandscapeRight)) {
    [self.secondViewController.view removeFromSuperView];
    self.firstViewController.view.frame = self.bounds;
    [self.view addSubView:self.firstViewController.view];
  } else {
    [self.firstViewController.view removeFromSuperView];
    self.secondViewController.view.frame = self.bounds;
    [self.view addSubView:self.secondViewController.view];
  }
}