如何从AppDelegate中的supportedInterfaceOrientationsFor方法获取调用ViewController?

时间:2018-03-15 07:22:15

标签: swift xcode uiviewcontroller orientation

我在我的应用程序中添加了一个功能,该功能位于Swift 4中,允许视图在显示图表时定向到横向或纵向。我为每个方向创建了两个单独的视图,并且我已经创建了处理该过程的逻辑。它可以正常工作,除了我可以解决的一个小问题,如果我可以确定调用ViewController。我尝试过使用

self.window?.rootViewController?.presentedViewController

哪个未被证明是准确的。我已经检查了应用程序和窗口的参数而没有任何成功。这是可能做的还是我需要依赖全局变量?

3 个答案:

答案 0 :(得分:0)

app delegate返回一个位掩码,指示完整应用程序支持的“最大集合”方向,无论当前呈现的是哪个视图控制器。

此外,还会询问所呈现的具体视图控制器(supportedInterfaceOrientations)并返回其自己支持的方向。

最后,两个返回值将相交以获得当前支持的方向。

如果我没记错的话,这两个值必须至少在一个方向上达成一致。如果是app delegate说它只支持“portrait(up)”,但视图控制器只支持“landscape left”,你的应用程序会崩溃(或做更糟糕的事情)

答案 1 :(得分:0)

您可以像这样检索应用程序的最顶层viewController:

func topViewController() -> UIViewController {
        let controller = UIApplication.shared.keyWindow?.rootViewController
        if let presentedVC = controller?.presentedViewController {
            return presentedVC
        }
        return controller!
    }

答案 2 :(得分:0)

进入topViewController取决于视图的配置。使用.isKind(of:VC)可帮助您根据可能使用的任何视图层次结构返回适当的ViewController:

private func topViewControllerWithRootViewController(rootViewController: UIViewController!) -> UIViewController? {
    if (rootViewController == nil) { return nil }
    if (rootViewController.isKind(of: UITabBarController.self)) {
        return topViewControllerWithRootViewController(rootViewController: (rootViewController as! UITabBarController).selectedViewController)
    } else if (rootViewController.isKind(of: UINavigationController.self)) {
        return topViewControllerWithRootViewController(rootViewController: (rootViewController as! UINavigationController).visibleViewController)
    } else if (rootViewController.presentedViewController != nil) {
        return topViewControllerWithRootViewController(rootViewController: rootViewController.presentedViewController)
    }
    return rootViewController
}