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。 我所做的是使用相同的自定义视图控制器
- 作为主视图控制器的第一种情况
- 第二种情况是UIPageViewController的子项
在第一种情况下,由于supportedInterfaceOrientations与应用程序支持的方向一致,所以在自定义导航控制器中由shouldAutorotate
和supportedInterfaceOrientations
组合决定一切。
在第二种情况下,即使UIPageViewController调用了自定义视图控制器的supportedInterfaceOrientations,也不会考虑返回值。 如果这两个方法在UIPageViewController的子类中被覆盖,它就会起作用。 我不确定这个副作用,因为这个class不应该被分类。
如果您的viewController
是UINavigationController
的子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"); } }