在单个视图控制器上支持多个方向

时间:2014-06-09 00:25:11

标签: ios objective-c uiviewcontroller uinavigationcontroller

我正在尝试做一件非常简单的事情:在我的应用程序中仅支持水平方向,除了1堆视图控制器。为简单起见,假设我有两个UIViewControllers。让我们称它们为maskLandscapeVC和maskAllVC。每个都单独嵌入自己的自定义UINavigationController实例中。这是导航控制器的代码。

#import "MPTLoginNav.h"

@interface MPTLoginNav ()

@end

@implementation MPTLoginNav

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark
#pragma Interface Orientaiton Methods

- (NSUInteger)supportedInterfaceOrientations
{
    if (self.isMaskAllStack)
        return UIInterfaceOrientationMaskAll;

    return UIInterfaceOrientationMaskLandscape;
}

- (BOOL)shouldAutorotate
{
    return YES;
}

@end

在maskLandscapeVC上,此代码工作正常,只能使用两个水平方向。 用户可以从maskLandscapeVC导航到maskAllVC。以下代码负责

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Storyboard" bundle:[NSBundle bundleForClass:[self class]]];
self.maskAllVC = [storyboard instantiateViewControllerWithIdentifier:@"maskAllVC"];
[self.navigationController pushViewController:self.maskAllVC animated:YES];

在maskAllVC,代码也很好用,并支持所有四个方向。

一旦进入maskAllVC,用户就会切换到VERTICAL方向。 maskLandscapeVC是maskAllVC的委托。在maskAllVC的垂直方向上,用户按下某个按钮。该按钮调用委托(maskLandscapeVC),根据某些条件,maskLandscapeVC决定解除maskAllVC。它使用以下代码

[self.maskAllVC.navigationController popViewControllerAnimated:YES];
[self.maskAllVC.navigationController dismissViewControllerAnimated:YES completion:nil];

现在回到maskLandscapeVC,方向仍然是垂直的,当然我的视图因为它完全搞砸了。

1 个答案:

答案 0 :(得分:0)

我认为因为你把它弹回来它并没有像第一次那样刷新整个ViewController。使用viewDidLoad而不是viewWillAppear可能是问题所在。 viewDidLoad只被调用一次。

如果设置断点,是否进行完整的layoutSubview刷新?当你弹出时,它是否会调用supportedInterfaceOrientations?如果将viewDidLoad代码移动到viewWillAppear会发生什么?