嵌套UINavigationController中的视图方向错误

时间:2012-11-15 06:01:52

标签: ios uinavigationcontroller

我希望我的所有观看次数都处于纵向模式。这有效,除非我将UINavigationController推到另一个上。在这种情况下,secondaryNavigationController内的视图将遵循设备方向。以下是我如何调用UINavigationControllers

[secondaryNavigationController setNavigationBarHidden:YES];
[[appDelegate secondaryNavigationController navigationBar] setHidden:YES];
[mainNavigationController presentModalViewController:[appDelegate secondaryNavigationController] animated:YES];

我的所有观点都实现了这种方法,但似乎没有帮助。

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

2 个答案:

答案 0 :(得分:1)

小心:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

Since it has been deprecated on iOS 6.0。目前,UIViewControllersUINavigationControllers内的UITabBarControllers轮换存在一些问题。要解决这个问题,在你的情况下,你应该对UINagivationController进行子类化或为它创建一个类别(尽管Apple比第一个更不鼓励第二个)。您可以使用this(这种情况适用于UITabBarController,但您可以理解逻辑),以检查如何进行子分类。然后,您可以针对UIViewControllers执行以下操作:

-(BOOL)shouldAutorotate
{
    return YES;
}

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

虽然您允许旋转(返回YES),但UIViewController将始终为纵向。这里的逻辑是,如果你来自景观中的UIViewController,如果你返回NO,那么你的UIViewController将留在景观中。

答案 1 :(得分:0)

以下是对我有用的完整答案,基于iYaniv的评论和Jacky Boy的回答。

我选择了iYaniv的类别并将其作为UINavigationController的子类而不是类别(这是你应该做的)。然后我用UINavigationController *替换了myUINavigationController *的所有实例。然后在我的所有UIViewControllers中使用了Jacky Boy的片段。

/* myUINavigationController.h */

#import <UIKit/UIKit.h>

@interface myUINavigationController : UINavigationController

@end

/* myUINavigationController.m */

#import "myUINavigationController.h"

@interface myUINavigationController ()

@end

@implementation myUINavigationController

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

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

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

@end