我终于想通了 :) 对于那些遇到同样问题的人,这里是解决方案。
您需要编写两个扩展。一个用于 TabBarController,一个用于 NavigationController。然后在导航控制器的扩展中,您需要通过检查正在加载到导航中的视图来覆盖您感兴趣的值。
UITabBarController 扩展基本上会传递来自子 UINavigationController 的值
extension UITabBarController {
override open var shouldAutorotate: Bool {
get {
if let visibleVC = selectedViewController {
return visibleVC.shouldAutorotate
}
return super.shouldAutorotate
}
}
override open var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation{
get {
if let visibleVC = selectedViewController {
return visibleVC.preferredInterfaceOrientationForPresentation
}
return super.preferredInterfaceOrientationForPresentation
}
}
override open var supportedInterfaceOrientations: UIInterfaceOrientationMask{
get {
if let visibleVC = selectedViewController {
return visibleVC.supportedInterfaceOrientations
}
return super.supportedInterfaceOrientations
}
}
}
UINavigation 扩展将检查正在加载的视图并为覆盖设置正确的值。下面将基本上允许我的屏幕旋转,但旋转到我感兴趣的方向。抽认卡以外的所有视图都将保持纵向,而抽认卡将仅处于横向。
extension UINavigationController {
override open var shouldAutorotate: Bool {
get {
if let visibleVC = visibleViewController {
return visibleVC.shouldAutorotate
}
return super.shouldAutorotate
}
}
override open var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation{
get {
if let visibleVC = visibleViewController {
if visibleVC.isKind(of: FlashCardController.classForCoder()) {
return UIInterfaceOrientation.landscapeLeft
} else {
return UIInterfaceOrientation.portrait
}
}
return super.preferredInterfaceOrientationForPresentation
}
}
override open var supportedInterfaceOrientations: UIInterfaceOrientationMask{
get {
if let visibleVC = visibleViewController {
if visibleVC.isKind(of: FlashCardController.classForCoder()) {
return UIInterfaceOrientationMask.landscape
} else {
return UIInterfaceOrientationMask.portrait
}
}
return super.supportedInterfaceOrientations
}
}
}