iOS 6应该是Autorotate:没有被调用

Liz*_*zza 48 iphone cocoa-touch rotation ios ios6

我一直在网上寻找解决方案,但一无所获.我正在尝试使我的iOS 5应用iOS 6兼容.我无法让定位的东西正常工作.我无法检测到旋转何时发生.这是我正在尝试的代码:

- (BOOL)shouldAutorotate {
    return NO;
}

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}
// pre-iOS 6 support
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    return (toInterfaceOrientation == UIInterfaceOrientationPortrait);
}
Run Code Online (Sandbox Code Playgroud)

新的supportedInterfaceOrientation:方法被调用就好了.但是,shouldAutorotate方法不会触发.我需要在旋转时进行一些图像交换,但我无法得到旋转即将发生的任何迹象.

提前致谢.

use*_*376 80

查看您的应用程序启动时是否收到以下错误.

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

如果是这样,修复它的方法是在AppDelegate.m文件中进行以下更改(尽管似乎有很多答案如何解决这个问题):

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

// With
[self.window setRootViewController:navigationController];  //NEW
Run Code Online (Sandbox Code Playgroud)

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


Mik*_*ard 45

当使用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
Run Code Online (Sandbox Code Playgroud)

  • 这是迄今为止最简单,最优雅的解决方案,允许NavigationController中的每个ViewController都有自己支持的接口方向. (5认同)

bor*_*den 15

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

应该旋转到方向(而不是shouldAutorotate)方法已被弃用,并且从iOS 6开始将不再被调用,但它无论如何都不会以您使用它的方式使用.

编辑对重复的downvotes的回应.请解释为什么使用我指出的方法不是(引用OP)"指示即将发生轮换".问题和标题的内容不匹配.

  • 我弄清楚为什么我的shouldAutorotate没有在iOS 6中被调用.这是由于我的视图控制器是UINavigationController的孩子,并且看起来导航控制器没有像前面的行为那样将-shouldAutorotate方法委托给它的topViewController.您可以通过继承UINavigationController并重写-shouldAutorotate和-supportedIntervalOrientations方法来解决这个问题. (14认同)
  • 这个答案是完全错误的,shouldAutorate并没有被弃用,事实上它只适用于IOS 6.0,它是确定屏幕是否旋转的正确方法.willRotateToInterfaceOrientation:duration:当屏幕旋转时调用yes,不确定是否旋转. (12认同)
  • - (BOOL)shouldRotate已经出现在iOS 6中,但它永远不会被调用.如何让一个视图控制器现在只旋转一些时间(例如有一个锁定按钮来防止旋转)? (2认同)
  • 在Apple论坛上有一个主题,Apple代表明确建议*反对*制作一个类别,但是继承子类.https://devforums.apple.com/message/744384 (2认同)

Adr*_*ian 10

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

iOS 6发行说明中:

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

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

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

在第一种情况下,一切都是在自定义导航控制器中通过组合决定的,shouldAutorotate并且与supportedInterfaceOrientations给定supportedInterfaceOrientations的应用程序支持的方向一致.

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


Bas*_*CAD 10

如果您viewController是a的孩子viewController,UINavigationController那么您可以执行以下操作:

  • 子类 UINavigationController
  • shouldAutoRotate在子类中覆盖
  • topViewController调用此方法时发送此消息

//此方法位于您的UINavigationController子类中

- (BOOL)shouldAutorotate
{
    if([self.topViewController respondsToSelector:@selector(shouldAutorotate)])
    {
        return [self.topViewController shouldAutorotate];
    }
    return NO;
}
Run Code Online (Sandbox Code Playgroud)
  • 现在你的viewControllers将分别响应这个方法.
  • 请注意,您可以对其他orinetaion方法执行相同操作