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
SwiftUI 4.0(iOS 16+)使用新的 Gauge 视图极简实现仪表盘外观
SwiftUI 4.0(iOS 16+)使用新的 Gauge 视图极简实现仪表盘外观