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

时间:2012-10-08 04:20:01

标签: iphone ios cocoa-touch rotation ios6

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

提前致谢。

9 个答案:

答案 0 :(得分:80)

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

  

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

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

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

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

应正确调用此shouldAutoRotate

答案 1 :(得分: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

答案 2 :(得分:15)

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

应该不推荐使用旋转方向(与shouldAutorotate相反)方法,并且从iOS 6开始不再调用它,但它无论如何都不能按照您使用它的方式使用。

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

答案 3 :(得分:10)

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

iOS 6 release notes中的

  

现在,iOS容器(例如UINavigationController)不会参考   他们的孩子,以确定他们是否应该自转。通过   默认,应用程序和视图控制器支持的界面   方向设置为iPad的UIInterfaceOrientationMaskAll   适用于iPhone的idiom和UIInterfaceOrientationMaskAllButUpsideDown   成语。

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

  1. 第一种情况作为主视图控制器
  2. 作为UIPageViewController的子级的第二种情况
  3. 在第一种情况下,在shouldAutorotatesupportedInterfaceOrientations的组合下,一切都是在自定义导航控制器中决定的,因为supportedInterfaceOrientations同意应用程序支持的方向。

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

答案 4 :(得分:10)

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

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

//此方法位于UINavigationController子类

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

答案 5 :(得分:1)

我的应用程序启动时也出现以下错误。

  

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

我正在使用UISplitViewController * splitViewController

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

替换

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

使用

[self.window setRootViewController:splitViewController];

shouldAutoRotate被调用并正常工作后。

答案 6 :(得分:1)

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

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

答案 7 :(得分: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");
        }
}

答案 8 :(得分: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