5

所以....我整个下午都在这上面度过,看过各种帖子并尝试了很多事情来让它发挥作用,但没有运气。我现在已经把它带回了一个尽可能简单的案例,但它似乎仍然不起作用。

在这个简单的场景中,我有一个故事板,其中只包含一个 UINavigationController 和一个初始视图控制器: 在此处输入图像描述

看过所有关于 IOS 6 中自动旋转方法更改的帖子后,我创建了 UINavigationController 的子类,并在该子类和第一个视图控制器上实现了 shouldAutorotate 和 supportedInterfaceOrientations 方法:

导航控制器:

// NavController.h
#import <UIKit/UIKit.h>

@interface NavController : UINavigationController

@end

// NavController.m
#import "NavController.h"

@interface NavController ()

@end

@implementation NavController

- (BOOL) shouldAutorotate {
    return YES;
}

- (NSUInteger) supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskAll;
}

@end

第一控制器

// FirstController.h
#import <UIKit/UIKit.h>

@interface FirstController : UIViewController

@end

// FirstController.m
#import "FirstController.h"

@interface FirstController ()

@end

@implementation FirstController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}

- (BOOL)shouldAutorotate {
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskAll;
}

@end

项目设置指定应支持所有旋转: 在此处输入图像描述

这些似乎都没有任何效果......!当我在模拟器中运行它时,我得到:

在此处输入图像描述

在此处输入图像描述

请..!我在这里想念什么?这真让我抓狂!我想至少让这个简单的案例工作,这样我就有希望让我相当大的应用程序工作!

4

3 回答 3

11

如果您打算为所有视图控制器启用或禁用旋转,则不需要继承 UINavigationController。而是使用:

   -(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 

在您的 AppDelegate 中。

如果您计划支持应用程序中的所有方向,但父视图控制器(UINavigationController 堆栈)上的不同方向,您应该使用

   -(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 

结合您的父视图控制器中的以下方法。

    - (BOOL)shouldAutorotate

- (NSUInteger)supportedInterfaceOrientations

但是,如果您计划在同一个导航堆栈中的不同子 ViewController 中具有不同的方向设置(像我一样),您需要检查导航堆栈中的当前 ViewController。

我在 UINavigationController 子类中创建了以下内容:

    - (BOOL)shouldAutorotate
{
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations
{
    int interfaceOrientation = 0;

    if (self.viewControllers.count > 0)
    {
        id viewController;
        DLog(@"%@", self.viewControllers);
        for (viewController in self.viewControllers)
        {
            if ([viewController isKindOfClass:([InitialUseViewController class])])
            {
                 interfaceOrientation = UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
            }
            else if ([viewController isKindOfClass:([MainViewController class])])
            {
                 interfaceOrientation = UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
            }
            else
            {
                 interfaceOrientation = UIInterfaceOrientationMaskAllButUpsideDown;
            }
        }
    }
    return interfaceOrientation;
}

由于您无法再从子 ViewControllers 控制呈现的视图控制器的旋转设置,因此您必须以某种方式拦截当前在导航堆栈中的视图控制器。所以这就是我所做的:)。希望有帮助!

于 2012-09-23T21:13:45.560 回答
1

发表你的AppDelegate->didFinishLaunchingWithOptions方法。

它应该是这样的:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
//    // Override point for customization after application launch.
//    self.window.backgroundColor = [UIColor whiteColor];
//    [self.window makeKeyAndVisible];
    return YES;
}
于 2012-09-24T05:58:15.283 回答
1

感谢您的建议……经过几个小时的挖掘,我终于发现出了什么问题。

出于某种原因,即使在项目设置中我指定了所有支持的方向,Xcode 也没有正确更新应用程序的 Info.plist!

对于我创建的示例项目,Xcode 仅向 Supported Interface Orientations (iPad) 字典添加了两个值:

 - Portrait (top home button)
 - Portrait (bottom home button)

添加两个缺失的方向最终使应用程序正确旋转:

 - Landscape (left home button)
 - Landscape (right home button)

在此处输入图像描述

不知道为什么这些设置不正确。多么令人沮丧的一天!

再次感谢您的帮助。

于 2012-09-24T06:21:14.303 回答