这是 StackOverflow 上的一个常见问题,但其他解决方案均无效。许多也是几年前写的。
以下是一些考虑的帖子:
UINavigationController 内的 viewController 是否可以有不同的方向?
UINavigationController 中仅支持一个视图的横向
UINavigationController 内的 viewController 是否可以有不同的方向?
为什么使用 UINavigationController 时不能强制横向?
如何在 iOS 8 中强制视图控制器方向?
我们在 UINavigationController 中嵌入了几个视图控制器:A、B、C、D。
A、B 使用肖像。
C、D使用风景。
A 是根控制器。
假设 B 被推到 A 上。这是可行的,因为 B 是纵向的。然而,当 C 被推到 B 上时,屏幕不会旋转,因为正如类文档所述:
通常,系统仅在根视图上调用此方法
窗口的控制器或用于填充的视图控制器
整个屏幕;子视图控制器使用窗口的一部分
由其父视图控制器为它们提供,不再
直接参与有关支持哪些轮换的决策。
如此压倒一切supportedInterfaceOrientations
自定义 UINavigationController 内部没有帮助,因为它不会在嵌入式控制器内的转换上进行咨询。
实际上,我们需要一种方法来强制在转换时改变方向,但似乎没有支持的方法。
以下是我们重写 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 进入某个方向(使用公开支持的方法),一种可能的解决方案可能是在显示新视图控制器时强制该方向。但这似乎也是不可能的。
建议?