UIWindow not showing over content in iOS 13
I was experiencing the same problems while upgrading my code for iOS 13 scenes pattern. With parts of your second code snippet I managed to fix everything so my windows are appearing again. I was doing the same as you except for the last line. Try removing viewController.present(...)
. Here's my code:
let windowScene = UIApplication.shared .connectedScenes .filter { $0.activationState == .foregroundActive } .firstif let windowScene = windowScene as? UIWindowScene { popupWindow = UIWindow(windowScene: windowScene)}
Then I present it like you do:
popupWindow?.frame = UIScreen.main.boundspopupWindow?.backgroundColor = .clearpopupWindow?.windowLevel = UIWindow.Level.statusBar + 1popupWindow?.rootViewController = self as? UIViewControllerpopupWindow?.makeKeyAndVisible()
Anyway, I personally think that the problem is in viewController.present(...)
, because you show a window with that controller and immediately present some 'self', so it depends on what 'self' really is.
Also worth mentioning that I store a reference to the window you're moving from inside my controller. If this is still useless for you I can only show my small repo that uses this code. Have a look inside AnyPopupController.swift
and Popup.swift
files.
Hope that helps, @SirOz
Based on all the proposed solutions, I can offer my own version of the code:
private var window: UIWindow!extension UIAlertController { func present(animated: Bool, completion: (() -> Void)?) { window = UIWindow(frame: UIScreen.main.bounds) window.rootViewController = UIViewController() window.windowLevel = .alert + 1 window.makeKeyAndVisible() window.rootViewController?.present(self, animated: animated, completion: completion) } open override func viewDidDisappear(_ animated: Bool) { super.viewDidDisappear(animated) window = nil }}
How to use:
// Show message (from any place)let alert = UIAlertController(title: "Title", message: "Message", preferredStyle: .alert)alert.addAction(UIAlertAction(title: "Button", style: .cancel))alert.present(animated: true, completion: nil)
Here are the steps to present a view controller in a new window on iOS 13:
- Detect focused
UIWindowScene
.
extension UIWindowScene { static var focused: UIWindowScene? { return UIApplication.shared.connectedScenes .first { $0.activationState == .foregroundActive && $0 is UIWindowScene } as? UIWindowScene }}
- Create
UIWindow
for the focused scene.
if let window = UIWindowScene.focused.map(UIWindow.init(windowScene:)) { // ...}
- Present
UIViewController
in that window.
let myViewController = UIViewController()if let window = UIWindowScene.focused.map(UIWindow.init(windowScene:)) { window.rootViewController = myViewController window.makeKeyAndVisible()}