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

Posted

技术标签:

【中文标题】无法使用导航控制器锁定视图控制器上的设备方向【英文标题】:Unable to lock device orientation on view controller with navigation controller 【发布时间】:2014-07-24 17:03:06 【问题描述】:

我在推送导航堆栈中有 9 个视图控制器。我希望我的所有视图控制器都锁定为纵向,但我的第四个视图控制器支持所有方向。我尝试了多种方法,但目前已将全局支持的设备方向设置为纵向,并将此代码添加到我的第四个视图控制器中,以使其支持所有方向。

-(NSUInteger)supportedInterfaceOrientations
    return UIInterfaceOrientationMaskAll;

-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation 
return (UIInterfaceOrientationPortrait | UIInterfaceOrientationLandscapeLeft | UIInterfaceOrientationLandscapeRight);

如果我在没有导航控制器的单个视图控制器上尝试这个,它工作正常。我也尝试在所有视图控制器上实现这些方法,设置全局设置以支持所有方向并添加代码以支持纵向方向但无济于事。

【问题讨论】:

不可能。 UINavigationController 是最顶层的UIViewController,无论它支持什么方向,它都支持堆栈上的所有UIViewControllers。这并不是说没有变通办法来实现您想要完成的任何事情。 你能建议解决方法吗 您能否建议您尝试提供的用户体验?通过“解决方法”,我的意思是您的程序将会改变 - UIViewController 将不再能够在 UINavigationController 堆栈中,最简单的解决方案是模态呈现它。 【参考方案1】:

这确实是可能的,我在我目前的一个项目中做到了。首先,您需要在项目常规选项卡中勾选您想要支持的所有方向选项。 其次,您创建一个 UINavigationController 的子类,它将成为您的导航控制器,例如,如果您有一个带有导航控制器的 Storyboard,您必须从 Interface Builder 的 Identity Inspector 选项卡中将其设置为您的自定义导航控制器。

您显然需要重写此类子类中的一些方法,它们是:

- (BOOL)shouldAutorotate 
    return YES;

这告诉导航控制器它需要允许视图控制器旋转。 之后,重写下面的方法,仔细阅读下面的实现:

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

这会从其 topViewController(当前可见的)获取支持的界面方向。

因此,您需要在所有视图控制器中覆盖相同的方法,如下所示:

- (NSUInteger)supportedInterfaceOrientations 
    return UIInterfaceOrientationMaskPortrait;

它将自己锁定在纵向上并且您想要返回:

UIInterfaceOrientationMaskSomethingDifferentFromPortrait

在我的情况下是

UIInterfaceOrientationMaskAllButUpsideDown

希望对你有帮助。

【讨论】:

【参考方案2】:

尝试在所有视图控制器中使用它来将它们修复为纵向,

(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window

return UIInterfaceOrientationMaskPortrait;

为第四个 viewController 添加

(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window

return UIInterfaceOrientationMaskAllButUpsideDown;

【讨论】:

以上是关于无法使用导航控制器锁定视图控制器上的设备方向的主要内容,如果未能解决你的问题,请参考以下文章

Swift 2:更改与选项卡栏控制器相关的视图上的导航标题

来回切换时锁定的 ViewController 方向中断

设备上的导航 UIBarButtonItem 外观不同

在视图控制器子类上添加导航控制器

允许不同的导航控制器视图有不同的方向规则

不同导航视图控制器上的后退按钮不同