iOS 6中的自动旋转具有奇怪的行为

我有UITabBarController应用程序播放video,并显示其他UITabBar选项卡中的其他信息。 在iOS 6 UIView旋转方法已被弃用,现在我需要使用shouldAutoRotatesupportedInterfaceOrientations方法。 对于video播放我使用MPMoviePlayerViewController

如何只旋转这个播放器视图? 我只能旋转整个应用程序,但不想这样做。 我介绍MPMoviePlayerViewController但它不像iOS 5和更早版本那样旋转。

plist设置中,我只设置了1个人像界面方向。 如果我设置其他 – 整个应用程序将被旋转。

从Apple的iOS 6 SDK发行说明:

自动旋转在iOS 6中正在改变。在iOS 6中,不推荐使用UIViewController的shouldAutorotateToInterfaceOrientation:方法。 在它的地方,你应该使用supportedInterfaceOrientationsForWindow:和shouldAutorotate方法。

更多的责任是转移到应用程序和应用程序委托。 现在,iOS容器(如UINavigationController)不会咨询他们的孩子,以确定他们是否应该自动旋转。 默认情况下,应用程序和视图控制器支持的界面方向设置为UIInterfaceOrientationMaskAll为iPad成语和UIInterfaceOrientationMaskAllButUpsideDown为iPhone成语。

视图控制器支持的界面方向可以随时间变化 – 即使应用程序支持的界面方向也可以随时间变化。 无论何时设备旋转或每当视图控制器呈现全屏模式呈现样式时,系统都要求最顶级的全屏视图控制器(通常是根视图控制器)支持其支持的接口方向。 此外,只有当这个视图控制器从其shouldAutorotate方法返回YES时,才会检索支持的方向。 系统将视图控制器支持的方向与应用程序支持的方向(由Info.plist文件或应用程序委托的应用程序:supportedInterfaceOrientationsForWindow:方法确定)相交,以确定是否旋转。

系统通过将应用程序的supportedInterfaceOrientationsForWindow:方法返回的值与最顶级的全屏控制器的supportedInterfaceOrientations方法返回的值相交来确定是否支持方向。 setStatusBarOrientation:animated:方法不被弃用。 现在,只有在最顶级全屏视图控制器的supportedInterfaceOrientations方法返回0时,该方法才有效。这使得调用者负责确保状态栏方向一致。

为了兼容性,仍然实现shouldAutorotateToInterfaceOrientation:方法的视图控制器不会获得新的自动旋转行为。 (换句话说,它们不会退回到使用应用程序,应用程序委托或Info.plist文件来确定支持的方向。)相反,shouldAutorotateToInterfaceOrientation:方法用于合成由supportedInterfaceOrientations方法返回的信息。

如果你想让你的整个应用程序旋转,那么你应该设置你的Info.plist来支持所有的方向。 现在如果你想要一个特定的视图只是肖像,你将不得不做一些子类,并重写自动旋转方法只返回肖像。 我在这里有一个例子:

https://stackoverflow.com/a/12522119/1575017

Ough! 花了一天半,问题解决了! 呵呵。

正如上面的文档所说,这是真的! 核心要点是:

更多的责任是转移到应用程序和应用程序委托 。 现在,iOS容器(如UINavigationController)不会咨询他们的孩子,以确定他们是否应该自动旋转。 默认情况下,应用程序和视图控制器支持的界面方向设置为UIInterfaceOrientationMaskAll为iPad成语和UIInterfaceOrientationMaskAllButUpsideDown为iPhone成语。

所以,随时根控制器改变的时候,系统会询问应用程序委托人“那么,我们是什么?旋转与否?

如果“旋转”:

仅当此视图控制器从其shouldAutorotate方法返回YES时,才会检索支持的方向

然后系统要求我们的应用程序代表

 - (NSUInteger) application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { return ...; } 

这真的很简单。

如何确定何时应该允许人像或风景等 – 取决于您。 根控制器的testing由于某些点而不适用于我,但是这个工作:

 - (NSUInteger) application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { return self.fullScreenVideoIsPlaying ? UIInterfaceOrientationMaskAllButUpsideDown : UIInterfaceOrientationMaskPortrait; } 

当我需要的时候,属性“fullScreenVideoIsPlaying”由我手动设置。

唯一需要注意的是重要的是枚举。 正如它在文档中所说…(仔细阅读上面的iPad / iPhone的东西)。 所以,你可以随心所欲地玩。

另一个微小的事情是closures播放器控制器后的一些错误的行为。 有一次,它没有改变方向,但发生了一次,以一种奇怪的方式,只有在模拟器(当然只有iOS 6)。 所以我什至不能作出反应,因为它意外地发生,并在点击我的应用程序的其他一些元素后,它旋转到正常的方向。 所以,不知道 – 可能是在模拟器工作或类似的东西(或者,真的是一个bug :))的一些延迟)。

祝你好运!

我与我的应用程序有同样的问题。

iOS 6的轮换是如何工作的。

=>当您在AppDelegate中使用UINavigationCOntroller方法时

 - (NSUInteger) application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { return } 

决定是否旋转。

=>当在Modal呈现样式中呈现视图的方法

 - (BOOL)shouldAutorotate 

在viewController里面的那个视图会触发appDelegate中的方法。 和第一例appDelegate决定旋转或不旋转。

我的解决scheme

我为莫代尔演讲做了什么。 在应用程序委托中创build了一个标志。

当旗子是YES的时候,它会旋转到横向和其他唯一的肖像。

 - (NSUInteger)application:(UIApplication*)application supportedInterfaceOrientationsForWindow:(UIWindow*)window { if(self.shouldRotate ) //shouldRotate is my flag { self.shouldRotate = NO; return (UIInterfaceOrientationMaskAll); } return (UIInterfaceOrientationMaskPortrait); } 

并在旋转之间切换

 - (BOOL)shouldAutorotate { YourAppDelegate *mainDelegate = (YourAppDelegate*)[[UIApplication sharedApplication]delegate]; mainDelegate.shouldRotate = YES; return YES; } 

注意 :这只适用于Modely Presents的视图。 使用标志,不是一个好的编码习惯。

您也可以inheritanceUITabBarController,使其向子代询问shouldAutorotate和supportedInterfaceOrientation,如下所示:

 @implementation MyTabBarController -(BOOL)shouldAutorotate { return [self.selectedViewController shouldAutorotate]; } -(NSUInteger)supportedInterfaceOrientations { return [self.selectedViewController supportedInterfaceOrientations]; } @end 

然后你只需使用你的自定义容器来代替标准的容器就行了! 刚刚testing过。

不幸的是,您需要打开plist中的所有方向,并在所有不想旋转的视图控制器上使用supportedInterfaceOrientations。 (在你的情况下,除video播放器以外的所有内容)

尝试这个,

如果TabBarController是用于窗口的RootViewController,那么创build自定义类inheritanceTabBarController说CustomTabBarController.h

在CustomTabBarController.h中添加下面的方法

 -(NSUInteger)supportedInterfaceOrientations // Must return Orientation Mask 

最后在AppDelegate.m下面调用

 - (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { if( [self.window.rootViewController supportedInterfaceOrientations]!=0) { return [self.window.rootViewController supportedInterfaceOrientations]; } return UIInterfaceOrientationMaskAll; } 

我发现设置这个最简单的方法是使用“支持的接口方向”button,你可以看看如果你看目标….摘要选项卡(在iPhone / iPad部署信息下)。

它基本上是一个GUI来设置plist文件