簡體   English   中英

如何在 iOS 13/14 中的應用程序頂部添加視圖

[英]How do I add a view to the top of an app in iOS 13/14

我正在嘗試向我的應用程序添加一個視圖,該視圖在流中是持久的,並且位於所有其他視圖之上。 在以前版本的 iOS 中,我已經能夠簡單地向位於我的應用程序頂部的UIWindow添加一個子視圖,但是從 iOS 13 開始,這似乎不再可能。

我嘗試了以下方法,但沒有成功: UIApplication.shared.windows.first(where: { $0.isKeyWindow })?.addSubview(someView)

進一步調試一下,我的應用程序的視圖層次結構中似乎根本沒有 window 。 我知道這一點,因為當在 follow forEach 語句上放置斷點時,我從來沒有得到一個斷點來執行。

UIApplication.shared.windows.forEach { (window) in
    window.addSubview(myView)
}

任何關於如何實現這一點的建議,在所有 iOS 版本 11 到 14 上,將不勝感激。

您必須創建第二個UIWindow ,分配rootViewController並使其可見。

下面的代碼是針對 SwiftUI 的,但是你可以對 UIKit 做同樣的事情,只需創建一個 window 並設置window.isHidden = false

let secondWindow = UIWindow(windowScene: windowScene)
secondWindow.frame = CGRect(x: 0, y: 40, width: UIScreen.main.bounds.size.width, height: 100)
let someView = Text("I am on top of everything")
secondWindow.rootViewController = UIHostingController(rootView: someView)
secondWindow.isHidden = false

取決於你有多少 windows。 您可能需要更改第二個windowLevel的 windowLevel。 您可以使用 Xcode 中的Debug View Hierarchy檢查 window 是否顯示。

這是一個沒有 SceneDelegate 的 UIKit 示例。 如果您有場景委托,則必須將 window 場景傳遞給 UIWindow init。 不要忘記保留第二個 window。


@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    private enum Constants {
        static let sessionConfiguration = URLSessionConfiguration.default
    }

    var window: UIWindow?
    var secondWindow: UIWindow?

    // MARK: - UIApplicationDelegate

    func application(_ application: UIApplication,
                     didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool {

        let window = UIWindow(frame: UIScreen.main.bounds)
        self.window = window
        let viewController = UIViewController()
        viewController.view.backgroundColor = .red

        window.rootViewController = viewController
        window.makeKeyAndVisible()

        let secondWindow = UIWindow()
        secondWindow.frame = CGRect(
            x: 0,
            y: 40,
            width: UIScreen.main.bounds.size.width,
            height: 100
        )

        let secondController = UIViewController()
        secondController.view.backgroundColor = .blue
        secondWindow.rootViewController = secondController
        secondWindow.isHidden = false
        self.secondWindow = secondWindow

        return true
    }
}

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM