【问题标题】: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。
我们对这些模式的排列有疑问。我尝试通过调整每个UIWindow 的window.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
}