0

我已经对我的 NavigationController 进行了子类化并添加了以下代码:

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskLandscapeLeft |UIInterfaceOrientationMaskPortrait;
} 
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return UIInterfaceOrientationLandscapeLeft;
}

我有 2 个视图控制器。如何在无法旋转的情况下强制一个横向模式和另一个纵向模式?(所有排序都在 plist 中启用)

4

3 回答 3

0

因此,经过大量尝试和错误后,我找到了可以使用的解决方案。

在您的 AppDelegate 中:

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{
    NSUInteger orientations = UIInterfaceOrientationMaskAllButUpsideDown;

    if(self.window.rootViewController){
        UIViewController *presentedViewController = [[(UINavigationController *)self.window.rootViewController viewControllers] lastObject];
        orientations = [presentedViewController supportedInterfaceOrientations];
    }

    return orientations;
}

这将把方向控制权交给根视图控制器。

在您的 DataManager.h 中(或您正在使用的任何其他单例......也可以使用 NSUserDefaults 完成。

@property (nonatomic, strong) NSString *currentView;

在您的 ViewController.m (根)中:

-(NSUInteger)supportedInterfaceOrientations
{

    if([[DataManager sharedDataManager].currentView isEqualToString:@"Trailer"])
    {
        return UIInterfaceOrientationMaskLandscapeRight;
    }
    else if([[DataManager sharedDataManager].currentView isEqualToString:@"Menu"])
    {
        return UIInterfaceOrientationMaskPortrait;
    }

    return UIInterfaceOrientationMaskPortrait;
}

从根 ViewController 中,您可以访问应用程序中所有 ViewControlles 的所有方向。如果您想将一个限制ViewController为横向而另一个限制为纵向,则非常有用。您需要添加到每个 ViewController 的唯一内容是ViewWillAppear您要为 ViewController 赋予的名称,如下所示:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [DataManager sharedDataManager].currentView = @"Menu";
}

使用此解决方案,您将不会收到关于在视图之间快速切换的烦人警告,就像您使用当前的 \ dissmis 视图解决方案强制旋转一样。也许有一种方法可以更好地识别 ViewController,我很想听听如何。如果您发现此解决方案有任何问题,我也很想听听。谢谢

于 2013-05-01T11:01:22.957 回答
0

我正在考虑仅针对 iOS 6.0 及更高版本进行轮换。在这里为 UINaviagtionController 创建类别可能是一个好方法。所以按照这些步骤

步骤 1. 将此代码放入您的 AppDelegate.m

    - (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
    {
        return UIInterfaceOrientationMaskAll;
    }

步骤 2. 为 UINaviagtionController 创建一个类别

方向.h

    #import <Foundation/Foundation.h>

    @interface UINavigationController (Orientation)

    @end

方向.m

    #import "Orientation.h"

    @implementation UINavigationController (Orientation)

    - (BOOL)shouldAutorotate {
       if (self.topViewController != nil)
            return [self.topViewController shouldAutorotate];
       else
            return [super shouldAutorotate];
     }

    - (NSUInteger)supportedInterfaceOrientations {
        if (self.topViewController != nil)
            return [self.topViewController supportedInterfaceOrientations];
        else
            return [super supportedInterfaceOrientations];
    }

    - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
        if (self.topViewController != nil)
            return [self.topViewController preferredInterfaceOrientationForPresentation];
        else
            return [super preferredInterfaceOrientationForPresentation];
    }

第 3 步。现在创建一个强制初始方向的 UIViewController 类。肖像

PortraitVC.h

    #import <UIKit/UIKit.h>

    @interface PortraitVC : ViewController

    @end

肖像VC.m

    - (BOOL)shouldAutorotate
    {
        return NO;
    }

    - (NSUInteger)supportedInterfaceOrientations
    {
        return UIInterfaceOrientationMaskPortrait;
    }
    - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
    {
       return UIInterfaceOrientationPortrait;
    }

同样对于景观

景观VC.h

    #import <UIKit/UIKit.h>

    @interface LandscapeVC : ViewController

    @end

景观VC.m

    - (BOOL)shouldAutorotate
    {
        return NO;
    }

    - (NSUInteger)supportedInterfaceOrientations
    {
        return UIInterfaceOrientationMaskLandscape;
    }
    - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
    {
       return UIInterfaceOrientationLandscapeLeft;
    }

第 4 步。现在您想要强制在纵向模式下且不进行旋转的原始 ViewController,在您的 viewDidLoad 中编写此代码

    PortraitVC *c = [[PortraitVC alloc] init];
    [self presentViewController:c animated:NO completion:NULL];
    [self dismissViewControllerAnimated:NO completion:NULL];

并像这样设置方向

    - (BOOL)shouldAutorotate
    {
        return NO;
    }

    - (NSUInteger)supportedInterfaceOrientations
    {
        return UIInterfaceOrientationMaskPortrait;
    }
    - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
    {
       return UIInterfaceOrientationPortrait;
    }

如果您只想在横向模式下强制原始 ViewController 不进行旋转,请在 viewDidLoad 中编写此代码

    LandscapeVC *c = [[LandscapeVC alloc] init];
    [self presentViewController:c animated:NO completion:NULL];
    [self dismissViewControllerAnimated:NO completion:NULL];

并像这样设置方向

    - (BOOL)shouldAutorotate
    {
        return NO;
    }

    - (NSUInteger)supportedInterfaceOrientations
    {
        return UIInterfaceOrientationMaskLandscape;
    }
    - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
    {
       return UIInterfaceOrientationLandscapeLeft;
    }

我这样做是因为只有当我们使用 presentViewController 或 presentModalViewController 时才会调用“preferredInterfaceOrientationForPresentation”。并且必须调用“preferredInterfaceOrientationForPresentation”来设置初始方向。

希望这可以帮助。

于 2013-05-01T09:01:17.377 回答
0

假设您使用的是 iOS6,请将您的自定义导航控制器更改为具有此功能(此解决方案似乎仅适用于模态或全屏演示):

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

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

然后在您想要景观添加的控制器中

    - (NSUInteger)supportedInterfaceOrientations
    {
        return UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskLandscapeLeft;
    }
    - (BOOL)shouldAutorotate
    {
        return YES;
    }

而在另一个

    - (NSUInteger)supportedInterfaceOrientations
    {
        return UIInterfaceOrientationMaskPortrait;
    }

    - (BOOL)shouldAutorotate
    {
        return YES;
    }
于 2013-04-30T20:07:08.333 回答