iOS 6 shouldAutorotate:不被调用

我一直在网上寻找解决办法,但是我什么也找不到。 我正在尝试使我的iOS 5应用程序iOS 6兼容。 我无法得到正确的工作方向。 我无法检测何时轮换即将发生。 这是我正在尝试的代码:

- (BOOL)shouldAutorotate { return NO; } - (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait; } // pre-iOS 6 support - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation { return (toInterfaceOrientation == UIInterfaceOrientationPortrait); } 

新的supportedInterfaceOrientation:方法被调用就好了。 然而,shouldAutorotate方法不会触发。 我需要做一些旋转的图像交换,但我不能得到任何旋转即将发生的迹象。

提前致谢。

看看您的应用程序启动时是否出现以下错误。

应用程序窗口预计在应用程序启动结束时具有根视图控制器

如果是这样的解决方法是通过在AppDelegate.m文件中进行以下更改(虽然似乎有多个答案如何解决这个问题):

 // Replace [self.window addSubview:[navigationController view]]; //OLD // With [self.window setRootViewController:navigationController]; //NEW 

在此之后,应该正确调用shouldAutoRotate

当使用UINavigationController作为应用程序的基础时,我使用下面的子类给予我灵活性,让最顶层的子视图控制器决定旋转。

 @interface RotationAwareNavigationController : UINavigationController @end @implementation RotationAwareNavigationController -(NSUInteger)supportedInterfaceOrientations { UIViewController *top = self.topViewController; return top.supportedInterfaceOrientations; } -(BOOL)shouldAutorotate { UIViewController *top = self.topViewController; return [top shouldAutorotate]; } @end 

该方法不是确定的方法。 正确的方法是willRotateToInterfaceOrientation:duration:

应该旋转到方向(而不是shouldAutorotate)方法已被弃用,将不再被称为iOS 6,但它并不意味着你使用它的方式。

编辑响应重复downvotes。 请解释为什么使用我指出的方法不是(引用OP)“表明即将发生旋转”。 问题的内容和标题是不匹配的。

看起来,在iOS 6上,容器导航控制器在旋转时不会查询子视图控制器:

在iOS 6发行说明中 :

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

这种行为很容易testing。 我所做的是使用相同的自定义视图控制器

  1. 作为主视图控制器的第一种情况
  2. 第二种情况是UIPageViewController的子项

在第一种情况下,由于supportedInterfaceOrientations与应用程序支持的方向一致,所以在自定义导航控制器中由shouldAutorotatesupportedInterfaceOrientations组合决定一切。

在第二种情况下,即使UIPageViewController调用了自定义视图控制器的supportedInterfaceOrientations,也不会考虑返回值。 如果这两个方法在UIPageViewController的子类中被覆盖,它就会起作用。 我不确定这个副作用,因为这个class不应该被分类。

如果您的viewControllerUINavigationController的子viewController ,那么您可以执行以下操作:

  • 子类UINavigationController
  • 覆盖你的子类中的shouldAutoRotate
  • 当这个方法被调用时,发送你的topViewController这个消息

//这个方法在你的UINavigationController子类中

 - (BOOL)shouldAutorotate { if([self.topViewController respondsToSelector:@selector(shouldAutorotate)]) { return [self.topViewController shouldAutorotate]; } return NO; } 
  • 现在你的viewControllers将分别响应这个方法。
  • 请注意,您可以使用其他orinetaion方法

当您的应用程序启动时,我也收到以下错误。

“应用程序窗口预计在应用程序启动结束时有一个根视图控制器”

我正在使用UISplitViewController * splitViewController

如果是这样的方式来解决它是通过在AppDelegate.m文件中进行以下更改:

更换

  [self.window addSubview:[splitViewController view]]; 

 [self.window setRootViewController:splitViewController]; 

在这之后,应该调用shouldAutoRotate并正常工作。

我正在使用iOS 7,但我相信我的情况可能对其他人有帮助。

我有一个以UITabBarController为根的深层视图控制器层次结构。 UA控件必须保证被调用的唯一地方是UITabBarController。 所以我简单地inheritanceUITabBarController,并将我的旋转控制逻辑放在我的shouldAutorotate方法中。

这是我将如何做到这一点

如果你想检查哪个是当前方向,那么把这一行添加到你的viewconrtoller.m文件中

  #define isPortrait [[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationPortrait || [[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationPortraitUpsideDown 

然后在那里你想检查方向,写下面的条件

 - (void)viewDidLoad { if(isPortrait) { //portrait mode.... NSLog(@"its in IsPotraitMode"); } else { //landscape mode.... NSLog(@"its in IsLandscapeMode"); } }