UIWindow not showing over content in iOS 13 UIWindow not showing over content in iOS 13 ios ios

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:

  1. Detect focused UIWindowScene.
extension UIWindowScene {    static var focused: UIWindowScene? {        return UIApplication.shared.connectedScenes            .first { $0.activationState == .foregroundActive && $0 is UIWindowScene } as? UIWindowScene    }}
  1. Create UIWindow for the focused scene.
if let window = UIWindowScene.focused.map(UIWindow.init(windowScene:)) {  // ...}
  1. Present UIViewController in that window.
let myViewController = UIViewController()if let window = UIWindowScene.focused.map(UIWindow.init(windowScene:)) {    window.rootViewController = myViewController    window.makeKeyAndVisible()}