Многократное расположение windows путем установки window.windowLevel работает на iOS 13, но не на iOS 12 - PullRequest
0 голосов
/ 25 февраля 2020

В нашем приложении мы представляем 3 viewController на 3 разных UIWindow s.

У нас возникла проблема с расположением этих модов. Я попытался исправить проблему, настроив свойство window.windowLevel для каждого UIWindow.

. По неизвестной причине исправление работает на iOS 13.1.2, но не на iOS 12.1.1. Есть идеи? Благодаря.

1 Ответ

0 голосов
/ 25 февраля 2020

Я считаю, windowLevel - это не то, что вам нужно. Даже если это работает или должно работать, оно является случайным, так как это свойство описывает стиль представления окна более, чем порядок windows.

. Вы можете продолжать удалять / добавлять windows или даже делать их скрытыми как часть обычного 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
    }

}

Lazily 3 windows загружаются каждый, имеющий контроллер представления с его собственным отличным цветом. Когда вы нажимаете на экран, сверху должно появиться «следующее» окно, чтобы вы могли продолжать переключаться между windows.

. Еще более безопасная реализация может быть такой же простой, как следующие:

@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
}
...