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如何显示不同的视图控制器以响应设备旋转?的主要内容,如果未能解决你的问题,请参考以下文章

切换iPhone视图的最佳做法?

如何捕获当前视图屏幕截图并在代码中重用? (iPhone SDK)

如何将视图从纵向模式旋转到横向模式

iPhone 6 Plus 上的拆分视图控制器旋转

iPhone UIViewController 滞后

在 iOS 6 上显示的视图消失了。我该如何解决?