锁定方向的 ViewController

Posted

技术标签:

【中文标题】锁定方向的 ViewController【英文标题】:ViewController with locked orientation 【发布时间】:2015-10-26 13:55:15 【问题描述】:

我遇到以下情况:

ViewController A 应该锁定在横向(左侧或右侧)。 VC A 的设置如下:

-(UIInterfaceOrientationMask)supportedInterfaceOrientations

    return UIInterfaceOrientationMaskLandscape;


-(BOOL)shouldAutorotate 
    return NO;

ViewController B 应该锁定在纵向上。它的设置如下:

-(UIInterfaceOrientationMask)supportedInterfaceOrientations

    return UIInterfaceOrientationMaskPortrait;


-(BOOL)shouldAutorotate 
    return NO;

没有导航控制器或标签栏。它只是一个普通的视图控制器,然后按下按钮我从 ViewController A 转到 ViewController B

[self performSegueWithIdentifier:@"ViewControllerB" sender:self];

到目前为止一切都很好。但是当我关闭 ViewController B 时,ViewController A 会出现在纵向上。这就是我解雇 VC B 的方式:

[self dismissViewControllerAnimated:YES completion:nil];

另一个问题是:当我在 ViewController B 上并且在纵向上没问题时,然后我开始快速将我的设备从纵向旋转到横向几次,并且尽管有上述方向规则,但它在某个点旋转到横向。有什么我遗漏的吗?

【问题讨论】:

【参考方案1】:

viewDidAppear: 尝试使用此方法旋转到您想要的方向,以防控制器负载时方向错误:

NSNumber *value = @(UIInterfaceOrientationLandscapeRight); // Or whatever else orientation you need.
[[UIDevice currentDevice] setValue:value forKey:@"orientation"];

还像这样重新定义您的 shouldAutorotate 方法:

- (BOOL)shouldAutorotate 
    // Change the YES or NO order depending on your viewController.
    return [UIDevice currentDevice].orientation == UIDeviceOrientationPortrait ? YES : NO;

并且也实现这个方法:

- (NSUInteger)supportedInterfaceOrientations 
    return UIInterfaceOrientationMaskPortrait; // Or whatever orientation you need in this viewController.

【讨论】:

感谢您的回复。起初它似乎工作 - 当我去 B 然后返回 A 时,它确实在 A 上强制执行横向。但是,我第二次这样做时问题再次发生 - A 在纵向上出现错误。这似乎是一种模式,一次有效,下一次无效。我确定有解释,但我找不到。

以上是关于锁定方向的 ViewController的主要内容,如果未能解决你的问题,请参考以下文章

即使设备已锁定方向,如何进行方向检测

当活动方向被锁定时检测设备方向

获取“锁定方向”,也称为“视图方向”

锁定活动方向时检测设备方向

iPad 上的 Cordova 锁定方向失败

如何为 React Native 锁定设备方向