无法使用导航控制器锁定视图控制器上的设备方向
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
,无论它支持什么方向,它都支持堆栈上的所有UIViewController
s。这并不是说没有变通办法来实现您想要完成的任何事情。
你能建议解决方法吗
您能否建议您尝试提供的用户体验?通过“解决方法”,我的意思是您的程序将会改变 - 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;
【讨论】:
以上是关于无法使用导航控制器锁定视图控制器上的设备方向的主要内容,如果未能解决你的问题,请参考以下文章