iPhone如何显示不同的视图控制器以响应设备旋转?
Posted
技术标签:
【中文标题】iPhone如何显示不同的视图控制器以响应设备旋转?【英文标题】:iPhone how to display a different view controller in response to device rotation? 【发布时间】:2013-05-22 13:38:44 【问题描述】:我注意到大多数消费者友好的 android 和 iPhone 健身应用程序都有两种界面模式 - 在纵向模式下,用户可以获得更详细的信息,但是当用户将设备切换到横向模式时,会添加一个全屏图形覆盖整个屏幕。
我对如何实现转换到不同的视图控制器以响应 iPhone 上的设备旋转感兴趣。 我最初的想法是拦截 (willRotateToInterfaceOrientation 事件,然后获取应用委托并添加一个全屏图形视图控制器到窗口)。
有没有更好的方法将 iPhone 旋转转换为另一个视图控制器?就像隐藏状态栏并在带有动画的横向模式下推送模态视图控制器?
【问题讨论】:
你最初的想法有什么问题? 【参考方案1】:首先问问自己是否真的需要一个单独的视图控制器。一个视图控制器可以轻松隐藏或取消隐藏图形。 如果此图需要自己的视图控制器,那么您可以使用包含引用其自己的视图控制器的图的容器视图。这就是容器视图的用途。 然后,“主”视图控制器将隐藏和取消隐藏容器视图以响应旋转事件(并相应地对其进行布局等。)
如果您更喜欢在其超级视图中添加或删除容器视图(从“主”视图控制器的角度来看,很可能是 self.view),那么请这样做,而不是隐藏和取消隐藏。这可能是最合适的。
这种方法的好处是,无论您处于何种导航结构,无论旋转的视图控制器是被推送还是以模态方式呈现,无论您是在标签栏驱动的应用程序还是单个视图中,它都可以工作应用程序,无论您使用的是故事板,还是与 IB 一起使用以及以编程方式等等。pp。
从应用程序的委托中获取窗口实例没有任何问题。我只是不认为有必要这样做。与其他选择相比,我觉得相当复杂。
【讨论】:
【参考方案2】:willRotateToInterfaceOrientation
方法效果很好。
除了切换视图之外,您可能还想做另外两件有用的事情:
1) 隐藏/显示状态栏。 (我喜欢横向隐藏)
[[UIApplication sharedApplication] setStatusBarHidden:UIInterfaceOrientationIsLandscape(toInterfaceOrientation) withAnimation:UIStatusBarAnimationSlide];
2) 隐藏/显示任何 UINavigationBar。 (也许您的横向视图会受益于额外的高度)
[self.navigationController setNavigationBarHidden:UIInterfaceOrientationIsLandscape(toInterfaceOrientation) animated:YES];
【讨论】:
你不会知道如何隐藏标签栏吧? @AlexStone 不要认为你可以使用标准的 UITabBarController。您可以考虑使用 github.com/NOUSguide/NGTabBarController 之类的替代方法 ... 我也发现了这个实现:github.com/idevsoftware/Cocoa-Touch-Additions/tree/master/… @AlexStone 看起来很方便,虽然可能很脆弱,因为它可能取决于 UITabBar/UITabBarController 的内部实现?【参考方案3】:您可以拥有一个具有 willRotateToInterfaceOrientation 方法的视图控制器,并且该视图控制器具有两个其他视图控制器作为变量。
一旦设备旋转,您就可以切换视图控制器的视图(非常粗略的代码示例:)
-(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];
【讨论】:
以上是关于iPhone如何显示不同的视图控制器以响应设备旋转?的主要内容,如果未能解决你的问题,请参考以下文章