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

问题描述 投票:0回答:3

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

self.window?.rootViewController?.presentedViewController

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

swift xcode uiviewcontroller orientation
3个回答
0
投票

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

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

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

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


0
投票

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

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

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
}
© www.soinside.com 2019 - 2024. All rights reserved.