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

Posted

技术标签:

【中文标题】在单个视图控制器上支持多个方向【英文标题】:Supporting multiple orientations on a single view controller 【发布时间】:2014-06-09 00:25:10 【问题描述】:

我正在尝试做一件非常简单的事情:在我的应用程序中只支持水平方向,除了 1 堆栈视图控制器。为简单起见,假设我有两个 UIViewController。我们称它们为 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】:

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

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

【讨论】:

以上是关于在单个视图控制器上支持多个方向的主要内容,如果未能解决你的问题,请参考以下文章

在一个模式视图控制器上强制 iOS 方向为横向

无法使用导航控制器锁定视图控制器上的设备方向

在单个视图控制器中使用多个 nib 文件?

在单个视图控制器中拥有多个表视图的最佳实践

如何在 iOS 7/8 的单个视图上禁用横向

IOS Interface Builder - 在单个视图控制器场景中管理多个视图