presentViewController不支持iOS 6中的方向

时间:2012-09-24 14:09:56

标签: iphone ios uinavigationcontroller orientation ios6

我正在使用此代码

if ([self respondsToSelector:@selector(presentViewController:animated:completion:)])
    {
        [self presentViewController:navigationControllerCustom animated:YES completion:nil];
    }
    else
    {
        [self presentModalViewController:navigationControllerCustom animated:YES];
    }

我的应用程序有两个方向纵向和纵向颠倒。此代码适用于iOS 5.1,但方向在iOS 6上不起作用

我还在navigationControllerCustom

上添加了此代码
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown);
}

-(NSUInteger)supportedInterfaceOrientations
{
    return (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown);
}

请帮我解决这个问题。

提前致谢。

5 个答案:

答案 0 :(得分:25)

您必须在申请代表中包含此内容:

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{
    return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
}

另外请确保View Controller的两者都具有以下功能,对我来说没问题。

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown);
}

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
}

该文档还说UINavigationController's没有查询其顶级View Controller支持的方向,尽管开发人员论坛上的Apple工程师确实这么说......似乎它没有。因此,您应该为UINavigationController添加一个类别,这是我使用的类别:

#import "UINavigationController+autorotate.h"

@implementation UINavigationController (autorotate)

- (NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
}

@end

有关AutoRotate如何在iOS 6 check out this answer

上运行的详细信息

答案 1 :(得分:2)

你忘了:

- (BOOL)shouldAutorotate {
    return YES;
}

答案 2 :(得分:1)

只需将该代码段上的代码片段粘贴到代码

即可
@implementation UINavigationController (rotation)
//temp hack for iOS6, this allows passing supportedInterfaceOrientations to child viewcontrollers.
- (NSUInteger)supportedInterfaceOrientations {
return [self.topViewController supportedInterfaceOrientations];
}

@end

答案 3 :(得分:1)

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

   -(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 
在你的AppDelegate中

如果您计划支持应用中的所有方向,但PARENT视图控制器(例如UINavigationController堆栈)的方向不同,则应使用

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

与父视图控制器中的以下方法结合使用。

    - (BOOL)shouldAutorotate

- (NSUInteger)supportedInterfaceOrientations

但是如果您计划在同一个导航堆栈(例如我)中的不同CHILDREN ViewControllers中使用不同的方向设置,则需要检查导航堆栈中的当前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;
}

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

答案 4 :(得分:1)

UINavigationController子类并覆盖这样的shouldAutorotate和supportedInterfaceOrientations:

-(BOOL)shouldAutorotate
{
    return self.topViewController.shouldAutorotate;
}

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

现在你可以控制每个ViewController的方向。只需覆盖每个ViewController中的两个方法。