Objective-C中iOS 6上的强制横向方向

时间:2012-12-14 03:30:36

标签: objective-c xcode uinavigationcontroller landscape

我有一个UINavigationController内的主视图控制器。在那个主视图控制器中,我有一个按钮,用于推送一个内部有UIWebView的详细视图控制器。我希望这个细节视图控制器在加载时处于横向模式。回到主视图控制器,它再次强制返回到纵向模式。我正在运行iOS 6。

我已经看到了其他类似的问题,但它并不适合我。我创建了一个LandscapeViewController,它是UIViewController的子类,我在这里编写了这些方法:

#pragma mark - Orientation Methods
- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskLandscape;
}

- (BOOL)shouldAutorotate
{
    return YES;
}

当我按下详细视图控制器时,这是我的代码:

DetailViewController *detailVC = [[DetailViewController alloc]
                                      initWithNibName:@"DetailViewController"
                                      bundle:nil];

    [self.navigationController pushViewController:detailVC
                                         animated:YES];

我正在考虑在上面的代码中将我的LandscapeViewController子类化到哪里以使其工作或如何正确地子类化并推送我的详细视图控制器。如果导航控制器无法将我的细节视图控制器从纵向推送到横向,我也可以模态显示我的详细视图控制器。我在哪里做错了?

2 个答案:

答案 0 :(得分:8)

考虑到: 视图A:仅限纵向 - 视图B:仅景观

我无法在导航控制器中执行此操作。相反,我所做的是从视图A打开模态视图以查看B并强制新的导航控制器进入此视图。

在iOS5 +中,这对我有用。

您需要为导航控制器创建一个类别:

<强>的UINavigationController + Rotation_IOS6.h

#import <UIKit/UIKit.h> 

@interface UINavigationController (Rotation_IOS6)

- (BOOL)shouldAutorotate;
- (NSUInteger)supportedInterfaceOrientations;
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation;

@end

<强>的UINavigationController + Rotation_IOS6.h

#import "UINavigationController+Rotation_IOS6.h"

@implementation UINavigationController (Rotation_IOS6)

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

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

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return [self.topViewController preferredInterfaceOrientationForPresentation];
}

@end

AppDelegate.m 中添加:

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

然后在查看A

- (BOOL)shouldAutorotate {
    return YES;
}

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

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return UIInterfaceOrientationPortrait;
}

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

也可以在查看A打开视图B 执行此操作:

ViewB *vc = [[ViewB alloc] initWithNibName:@"ViewB" bundle:nil];

UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:vc];

[self presentViewController:navigationController animated:YES completion:nil];

最后,在查看B

- (BOOL)shouldAutorotate {
    return YES;
}

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

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return UIInterfaceOrientationLandscapeRight;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationLandscapeRight || interfaceOrientation == UIInterfaceOrientationLandscapeLeft);
}

答案 1 :(得分:0)

他们有点搞砸iOS 6中的小狗。这是我到目前为止所知道的:

首先,Apple在Xcode 4.5中添加了“Supported Interface Orientations”按钮。这对应于_info.plist中的“支持的接口方向”属性。在任何其他按钮工作之前,必须将这些按钮切换到正确的选项。 (如果按钮似乎拒绝切换它可能是因为info.plist被CVS或其他一些进程锁定。)

接下来,必须设置属性.window.rootViewController,并且必须指向堆栈中的“底部”视图控制器。通常,这将是导航控制器或标签控制器。

如果希望禁用所有旋转,可以使用按钮完成,或者可以在“底部”视图控制器中实现“shouldAutorotate”方法并让它返回NO。 (如果省略该方法,则默认值为YES。)

尽管使用了shouldAutorotate禁用了自动旋转,但如果显示的是MPMoviePlayerViewController,则会自动旋转。只有切换支持的界面方向按钮才会出现这种情况。

如果想要有条件地自动旋转其他视图控制器,它会变得更加混乱。基本上,您的“底部”视图控制器必须实现supportedInterfaceOrientations方法,并根据当前的topViewController返回相应的位掩码。这可以通过查询topViewController的旧“shouldAutorotateToInterfaceOrientation”方法的例程来完成,但它有点难看。即使此方案不需要修改旋转视图控制器的代码,您也需要在旋转的控制器代码“下方”修改VC以实现“supportedInterfaceOrientation”,否则该视图将在返回时旋转。 (至少这是一个简单的复制/粘贴。)但似乎没有人想出一个更好,更通用的方案。