我注意到大多数消费者友好的Android和iPhone健身应用程序都有两种界面模式 - 在纵向模式下,用户可以获得更详细的信息,但当用户将设备转为横向模式时,会添加一个全屏图形覆盖整个屏幕。
我对如何在iPhone上响应设备轮换实现向不同视图控制器的转换感兴趣。我最初的想法是拦截(willRotateToInterfaceOrientation事件,然后获取应用委托并添加一个全屏图形视图控制器到窗口)。
有没有更好的方法将iPhone旋转转换为转换到另一个视图控制器?喜欢隐藏状态栏并使用动画在横向模式下推动模态视图控制器吗?
答案 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];
}
}