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

问题描述:

我注意到,大多数对消费者友好的Android和iPhone健身应用程序有两种界面模式 - 纵向模式下用户可以获得更详细的信息,但是当用户将设备转换为横向模式时,会添加全屏幕图表整个屏幕。iPhone如何显示不同的视图控制器响应设备旋转?

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

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

+0

你最初的想法有什么问题? –

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

如果你喜欢添加或从超级视图中删除容器视图(最“可能self.view从”主“视图控制器的角度来看)然后做到这一点,而不是隐藏和取消隐藏。这可能是最合适的。

这个appoach的好处在于,无论您是在导航结构中,它都能正常工作,无论您是在推送还是以模态方式呈现旋转的视图控制器,无论您是在标签栏驱动的应用程序还是单个查看应用程序,无论您是使用故事板,与IB一起使用以及编程式等等。从页面的代理中获取窗口实例没有任何问题。我只是没有看到这样做的需要。与其他选择相比,我看起来相当复杂。

您可以拥有一个具有willRotateToInterfaceOrientation方法的视图控制器,并且该视图控制器具有两个其他viewcontroller作为变量。

一旦装置旋转,则切换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]; 
    } 
} 

willRotateToInterfaceOrientation方法效果很好。

除了交换意见,另外两个有用的东西,你可能想要做的有:

1)隐藏/显示状态栏。 (我喜欢把它藏在景观)

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

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

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

你不知道如何隐藏标签栏,你会吗? –

+0

@AlexStone不要以为你可以用标准的UITabBarController。你可以看看使用替代像https://github.com/NOUSguide/NGTabBarController ... –

+0

我也发现这个实现:https://github.com/idevsoftware/Cocoa-Touch-Additions/tree/master/UITabBarController_setHidden –