[通过设置window.windowLevel的多个窗口排列在iOS 13上有效,但在iOS 12上无效

问题描述 投票:-1回答:1

在我们的应用程序中,我们在3个不同的UIWindow上显示3个viewController。

我们对这些模式的安排有疑问。我试图通过调整每个window.windowLevelUIWindow属性来解决此问题。

由于某些未知原因,此修复程序适用于iOS 13.1.2,但不适用于iOS 12.1.1。任何想法?谢谢。

ios swift ios12 uiwindow ios13.1.2
1个回答
0
投票

我相信windowLevel根本不是您要查找的属性。即使这行得通或应该行事,这也是偶然的,因为此属性比窗口的顺序更多地描述了窗口表示样式。

您可以继续删除/添加窗口,甚至可以将它们隐藏为常规API的一部分。或者,您可以只在要在顶部看到的窗口上使用makeKeyAndVisible

请参见下面的快速用法示例:

class ViewController: UIViewController {

    private static var windows: [UIWindow] = {
        let colors: [UIColor] = [.red, .blue, .green]
        return colors.map { color in


            let window: UIWindow
            if #available(iOS 13.0, *) {
                let scene = UIApplication.shared.windows.first!.windowScene!
                window = UIWindow(windowScene: scene)
            } else {
                // Fallback on earlier versions
                window = UIWindow(frame: UIScreen.main.bounds)
            }

            window.rootViewController = {
                let controller = ViewController()
                controller.view.backgroundColor = color
                return controller
            }()
            window.makeKeyAndVisible()
            return window
        }
    }()
    private static var windowIndex: Int = 0

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(onTap)))
    }

    @objc private func onTap() {
        let actualIndex = ViewController.windowIndex%ViewController.windows.count
        ViewController.windows[actualIndex].makeKeyAndVisible()
        ViewController.windowIndex += 1
    }

}

懒惰地加载了3个窗口,每个窗口都有一个具有自己独特颜色的视图控制器。当您点击屏幕时,“下一个”窗口应显示在顶部,以便您可以在两个窗口之间继续切换。

甚至更安全的实现也可以像下面这样简单:

@objc private func onTap() {
    let actualIndex = ViewController.windowIndex%ViewController.windows.count
    ViewController.windows.enumerated().forEach { index, window in
        if index == actualIndex {
            window.makeKeyAndVisible()
        } else {
            window.isHidden = true
        }
    }
    ViewController.windowIndex += 1
}
© www.soinside.com 2019 - 2024. All rights reserved.