在我们的应用程序中,我们在3个不同的UIWindow
上显示3个viewController。
我们对这些模式的安排有疑问。我试图通过调整每个window.windowLevel
的UIWindow
属性来解决此问题。
由于某些未知原因,此修复程序适用于iOS 13.1.2
,但不适用于iOS 12.1.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
}