如何从 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?

iOS 如何使用TabbarController

我应该如何从 TabBarController 呈现模态视图控制器

MonoTouch:如何从 TabBarController 的多个视图中选择初始视图

如果它在 TabBarController 中,如何从 AppDelegate 访问 ViewController 的属性?

如何通过 TabBarController => NavbarController 从 Appdelegate 呈现视图控制器