1

我已经坚持了一段时间,无法弄清楚如何从子级(导航控制器 ---> 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。TabBar 到导航到 tableView

  • iOS 10
  • Xcode 8.2
  • 斯威夫特 3
4

1 回答 1

0

我终于想通了 :) 对于那些遇到同样问题的人,这里是解决方案。

您需要编写两个扩展。一个用于 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
        }
    }
}
于 2017-03-23T06:21:52.307 回答