如何从 TabBarController 上 NavigationController 的 TableViewController 子项锁定旋转
Posted
技术标签:
【中文标题】如何从 TabBarController 上 NavigationController 的 TableViewController 子项锁定旋转【英文标题】:How to lock rotation from a TableViewController child of NavigationController on TabBarController 【发布时间】:2017-03-22 06:54:09 【问题描述】:我已经被这个问题困扰了一段时间,无法弄清楚如何从子级(导航控制器 ---> TableViewController)覆盖 TabBarController 的“shouldAutoRotate”变量
所以基本上这是我的设置 TabBarController ---> Navigation Controller ---> Main TableViewController ---> VocabularyDetail TableviewController
我知道 TabBarController 中的以下覆盖将锁定所有子视图的旋转。
override var supportedInterfaceOrientations : UIInterfaceOrientationMask
return UIInterfaceOrientationMask.portrait
override var shouldAutorotate : Bool
return false
然而,挑战在于我想根据已加载到导航控制器中的视图有选择地执行此覆盖。如果您查看图片,最后一个控制器是“Vocabulary Detail”,它应该将“shouldAutorotate”变量更改为 true。
ios 10 Xcode 8.2 斯威夫特 3【问题讨论】:
有人吗?任何指针都会有所帮助.... 【参考方案1】:我终于明白了:) 对于那些遇到同样问题的人,这里是解决方案。
你需要写两个扩展。一个用于 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
【讨论】:
以上是关于如何从 TabBarController 上 NavigationController 的 TableViewController 子项锁定旋转的主要内容,如果未能解决你的问题,请参考以下文章
如何从 AppDelegate 上的 TabBarController 获取 ViewController?
我应该如何从 TabBarController 呈现模态视图控制器
MonoTouch:如何从 TabBarController 的多个视图中选择初始视图
如果它在 TabBarController 中,如何从 AppDelegate 访问 ViewController 的属性?
如何通过 TabBarController => NavbarController 从 Appdelegate 呈现视图控制器