14

我正在使用此代码

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);
}

请帮我解决这个问题。

提前致谢。

4

5 回答 5

25

您必须将其包含在您的应用程序委托中:

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

还要确保视图控制器都具有以下内容,对我来说可以正常工作。

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

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

该文档还说,UINavigationController's它不会查询其顶部视图控制器以获取支持的方向,尽管开发者论坛上的一位 Apple 工程师确实这么说......似乎它没有。因此,您应该为 添加一个类别UINavigationController,这是我使用的类别:

#import "UINavigationController+autorotate.h"

@implementation UINavigationController (autorotate)

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

@end

有关 AutoRotate 如何在 iOS 6 上工作的更多信息,请查看此答案

于 2012-10-03T16:09:46.510 回答
2

你忘了:

- (BOOL)shouldAutorotate {
    return YES;
}
于 2012-09-24T16:26:50.893 回答
1

只需将该代码段复制粘贴到您的代码上方即可

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

@end
于 2012-10-03T16:12:32.563 回答
1

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

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

在您的 AppDelegate 中。

如果您计划支持应用程序中的所有方向,但父视图控制器(例如 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;
}

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

于 2013-01-20T00:28:24.693 回答
1

子类 UINavigationController 并覆盖 shouldAutorotate 和 supportedInterfaceOrientations,如下所示:

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

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

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

于 2013-02-08T07:15:33.607 回答