【发布时间】:2017-01-02 20:48:17
【问题描述】:
这是 StackOverflow 上的常见问题,但其他解决方案均无效。许多也是几年前写的。
以下是一些考虑的帖子:
Is it possible to have different orientations for viewControllers inside UINavigationController?
Support landscape for only one view in UINavigationController
Is it possible to have different orientations for viewControllers inside UINavigationController?
Why can't I force landscape orientation when use UINavigationController?
我们在 UINavigationController 中嵌入了几个视图控制器:A、B、C、D。
A、B 使用纵向。
C、D 使用横向。
A 是根控制器。
假设 B 被推到 A 上。这是可行的,因为 B 是纵向的。但是,当 C 被推到 B 上时,屏幕不会旋转,因为正如类文档所述:
通常,系统仅在根视图上调用此方法 窗口的控制器或视图控制器,用于填充 整个屏幕;子视图控制器使用窗口的一部分 由他们的父视图控制器为他们提供,不再 直接参与有关支持哪些轮换的决策。
因此,在自定义 UINavigationController 中覆盖 supportedInterfaceOrientations 并没有帮助,因为它不会在嵌入式控制器中进行转换。
实际上,我们需要一种在转换时强制改变方向的方法,但似乎没有支持的方法。
以下是我们覆盖 UINavigationController 的方式(扩展现在仅用于调试目的,因为显然扩展不应该用于覆盖):
extension UINavigationController {
override open var shouldAutorotate: Bool {
return true
}
override open var supportedInterfaceOrientations : UIInterfaceOrientationMask {
return visibleViewController?.supportedInterfaceOrientations ?? UIInterfaceOrientationMask.landscapeRight
}
}
在嵌入式视图控制器中,我们尝试像这样设置方向:
override var shouldAutorotate: Bool {
return true
}
override var preferredInterfaceOrientationForPresentation : UIInterfaceOrientation {
return UIInterfaceOrientation.landscapeRight
}
override var supportedInterfaceOrientations : UIInterfaceOrientationMask {
return UIInterfaceOrientationMask.landscapeRight
}
总而言之,目标是:
1) 显示嵌入在 UINavigationController 中的具有不同方向的视图控制器。
2) VC 转换应该产生适当的方向变化(例如,从 C->B 弹出应该产生纵向,从 D->C 弹出应该产生横向,从 B->C 推动应该产生横向,从 A-> 推动B 应该产生肖像)。
如果可以强制 UINavigationController 进入一个方向(使用公开支持的方法),一种可能的解决方案是在显示新视图控制器时强制该方向。但这似乎也不可能。
建议?
【问题讨论】:
标签: ios swift uiviewcontroller uinavigationcontroller uikit