SwiftUI - 在 UIWindow 上显示视图

Posted

技术标签:

【中文标题】SwiftUI - 在 UIWindow 上显示视图【英文标题】:SwiftUI - Display view on UIWindow 【发布时间】:2021-09-30 10:20:41 【问题描述】:

我正在尝试在 android 中显示类似于 Toast 的自定义 SwiftUI 视图。 我的问题是我想使用当前的 UIWindow 将这个特定的视图显示在其他所有内容之上。

目前,在我的ToastView 中的static func displayToastAboveAll() 上工作时,我已经走了多远

public struct ToastView: View 
    static func displayToastAboveAll() 
        let window = UIApplication.shared.windows.filter  $0.isKeyWindow .first // window
        let viewToShow = ToastView(my params) // my view to display

        // This part I'm not sure of
        let hostingController = UIHostingController(rootView: viewToShow)
        window?.addSubview(hostingController.view)
    

    public var body: some View 
        // MyDesign
    

知道我应该如何使用窗口将 ToastView 放在适当的位置,并且在显示视图的同时仍然能够在应用程序中导航(并使用插座)?

【问题讨论】:

【参考方案1】:

我设法做我想做的事。 基本上,这段代码是有效的,但我必须从我的 SwiftUI 视图中删除一些约束,并使用静态函数将它们添加到 UIKit 中。 此外,我必须通过一个修饰符(见下文)并将 ToastView 初始化为私有。

public struct ToastModifier: ViewModifier 
    public func body(content: Content) -> some View 
        content
    


extension View 
    public func toast() -> some View 
        ToastView.displayToastAboveAll()
        return modifier(ToastModifier())
    


这样做是为了强制使用任一修饰符(SwiftUI,通过执行 .toast,就像您执行 .alert 一样)或直接通过调用静态函数 ToastView.displayToastAboveAll() (UIKit)。 事实上,我不希望这个 Toast 成为视图的一部分,我想像警报一样触发它。

最后,特别警告,因为将ToastView 传递给UIHostingViewController 会干扰一些动画。 我必须在 UIKit 中重写动画才能获得漂亮的滑动和淡入淡出动画。

【讨论】:

以上是关于SwiftUI - 在 UIWindow 上显示视图的主要内容,如果未能解决你的问题,请参考以下文章

UIWINDOW 子视图上的 UIAccessibility

在变暗的 UIWindow 上显示 UIView

SwiftUI 4.0(iOS 16+)使用新的 Gauge 视图极简实现仪表盘外观

SwiftUI 4.0(iOS 16+)使用新的 Gauge 视图极简实现仪表盘外观

如何在 iOS 14 @main 文件中获取 UIWindow 值?

iOS开发UI篇—UIWindow简单介绍