ios - 如何在 iOS 13/14 中将 View 添加到应用程序顶部

标签 ios swift uiview uiwindow

我正在尝试向我的应用程序添加一个 View ,该 View 在流中保持不变,并且位于所有其他 View 之上。在以前版本的 iOS 中,我可以简单地向应用程序顶部的 UIWindow 添加 subview ,但从 iOS 13 开始,这似乎不再可能了。

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

进一步调试,我的应用程序的 View 层次结构中似乎根本没有窗口。我知道这一点是因为当在下面的 forEach 语句上放置断点时,我永远不会得到要执行的断点。

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

任何有关如何在所有 iOS 版本 11 到 14 上实现此目标的建议将不胜感激。

最佳答案

您必须创建第二个 UIWindow,分配 rootViewController 并使其可见。

下面的代码适用于 SwiftUI,但您可以对 UIKit 执行相同的操作,只需创建一个窗口并设置 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

取决于您有多少个窗口。您可能需要更改第二个窗口的windowLevel。 您可以使用 Xcode 中的调试 View 层次结构检查窗口是否显示。

这是一个没有 SceneDelegate 的 UIKit 示例。如果您有场景委托(delegate),则必须将窗口场景传递给 UIWindow init。 不要忘记保留第二个窗口。


@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
    }
}

enter image description here

关于ios - 如何在 iOS 13/14 中将 View 添加到应用程序顶部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66236651/

相关文章:

ios - Swift 使用来自 Parse 的数据解包 Optional 值时出现 fatal error

swift - CircleCI Swift 与 Postgres 连接问题

c - 如何使用 Xcode 编译 C 程序,以便在沙箱中使用二进制文件?

ios - 自定义 UIView 不适合屏幕边界,Swift

android - 将共享按钮添加到适用于 Android 和 iOS 的 LibGDX

ios - 标签在 UITableView 中没有正确实现,为什么?

swift - 使用 Vapor 迭代调用返回 Future 的方法

swift - 未填充 append 重叠的 UIBezierPath

ios - uiview 大小问题 Xcode

ios - UITextField 自动完成?