【问题标题】:multiple windows arrangement by setting window.windowLevel works on iOS 13 but not on iOS 12通过设置 window.windowLevel 的多个窗口排列适用于 iOS 13 但不适用于 iOS 12
【发布时间】:2020-06-09 03:02:02
【问题描述】:

在我们的应用程序中,我们在 3 个不同的 UIWindows 上呈现 3 个 viewController。

我们对这些模式的排列有疑问。我尝试通过调整每个UIWindowwindow.windowLevel 属性来解决此问题。

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

【问题讨论】:

    标签: ios swift ios12 uiwindow ios13.1.2


    【解决方案1】:

    我相信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
    }
    

    【讨论】:

      猜你喜欢
      • 2020-02-05
      • 2020-02-04
      • 1970-01-01
      • 2014-04-06
      • 2018-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-01
      相关资源
      最近更新 更多