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

问题描述 投票:48回答:9

我一直在网上寻找解决方案,但一无所获。我正在尝试使我的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方法不会触发。我需要在旋转时进行一些图像交换,但我无法得到旋转即将发生的任何迹象。

提前致谢。

iphone ios cocoa-touch rotation ios6
9个回答
80
投票

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

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

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

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

// With
[self.window setRootViewController:navigationController];  //NEW

在此之后,应正确调用shouldAutoRotate


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

15
投票

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

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

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


10
投票

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

iOS 6 release notes

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

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

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

在第一种情况下,一切都是在自定义导航控制器中通过shouldAutorotatesupportedInterfaceOrientations的组合决定的,因为supportedInterfaceOrientations同意应用程序支持的方向。

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


10
投票

如果您的viewControllerviewController中的孩子UINavigationController,那么您可以执行以下操作:

  • 子类UINavigationController
  • 覆盖子类中的shouldAutoRotate
  • 调用此方法时,将此消息发送给您的topViewController

//此方法位于UINavigationController子类中

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

1
投票

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

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

我正在使用UISplitViewController * splitViewController

如果是这样,修复它的方法是在AppDelegate.m文件中进行以下更改:

更换

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

[self.window setRootViewController:splitViewController];

在此之后,shouldAutoRotate被调用并正常工作。


1
投票

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

我有一个以UITabBarController为根的深视图控制器层次结构。保证调用shouldAutorotate的唯一地方是UITabBarController。所以我只是将UITabBarController子类化,并将我的旋转控制逻辑放在我的shouldAutorotate方法中。


0
投票

我就是这样做的

如果要检查哪个是当前方向,请将此行添加到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");
        }
}

0
投票

如果您使用UINavigationController作为应用程序的基础。我创建了一个UINavigationController类,并将其命名为“UINavigationController + autoRotate”。把它放在你的UINavigationController + autoRotate.h中:

#import <UIKit/UIKit.h>

@interface UINavigationController (autoRotate)

-(BOOL)shouldAutorotate;
-(NSUInteger)supportedInterfaceOrientations;

@end

把它放在UINavigationController + autoRotate.m中:

#import "UINavigationController+autoRotate.h"

@implementation UINavigationController (autoRotate)

- (BOOL)shouldAutorotate
{
    return [self.visibleViewController shouldAutorotate];
}

- (NSUInteger)supportedInterfaceOrientations
{
    return [self.topViewController supportedInterfaceOrientations];
}

@end
© www.soinside.com 2019 - 2024. All rights reserved.