我在 SwiftUI 中为导航标题获取模糊背景的两次尝试均无效

My two attempts at getting a blurred background for a navigation title in SwiftUI are not working

初学者在这里制作了一个简单的待办事项列表,但试图仅为导航标题获得模糊背景。我正在尝试使用和不使用 UIViewRepresentable 结构来执行此操作。这是我没有 UIViewRepresentable 结构的方法。

"""

构造 ContentView:视图 {

init() {
    let appearance = UINavigationBarAppearance()

    appearance.backgroundEffect = UIBlurEffect(style: .regular)

    UINavigationBar.appearance().standardAppearance = appearance        
    UITableView.appearance().backgroundColor = .clear
}

var body: some View {
    
        VStack {
            GeometryReader { geometry in
            VStack {
                List {
                    ListEntry()
                }
                .opacity(0.8)
                .frame(height: geometry.size.height*(4/5))
            }
            VStack {
                // empty for now
            }
            }
        }
        .background(LeavesBackgroundView())
        .navigationTitle(Text("Monday, Apr 26"))
        .navigationBarItems(trailing: Image(systemName: "gear"))
}

}

"""

..现在有了 UIViewRepresentable 结构:

"""

构造 theBlurView: UIViewRepresentable {

@State var style: UIBlurEffect.Style = .systemMaterial

func makeUIView(context: Context) -> UIVisualEffectView {
    let view = UIVisualEffectView(effect: UIBlurEffect(style: style))
    return view
}

func updateUIView(_ uiView: UIVisualEffectView, context: Context) {
    uiView.effect = UIBlurEffect(style: style)
}

}

构造 ContentView:视图 {

init() {
    let appearance = UINavigationBarAppearance()

    appearance.backgroundEffect = theBlurView(style: .regular) // error right here

    UINavigationBar.appearance().standardAppearance = appearance       
    UITableView.appearance().backgroundColor = .clear
}

var body: some View {
    
        VStack {
            GeometryReader { geometry in
            VStack {
                List {
                    ListEntry()
                }
                .opacity(0.8)
                .frame(height: geometry.size.height*(4/5))
            }
            VStack {
                // empty for now
            }
            }
        }
        .background(LeavesBackgroundView())
        .navigationTitle(Text("Monday, Apr 26"))
        .navigationBarItems(trailing: Image(systemName: "gear"))
}

}

"""

在第二种情况下,我收到错误“无法将类型 'theBlurView' 的值分配给类型 'UIBlurEffect?'”,但我无法找到使它们成为同一类型的方法。 在第一种情况下,我没有收到任何错误,但我得到了一个白色不透明的导航标题背景。

在这两种情况下,我都明白了 this

其中导航标题背景为白色。我也尝试了不同的 material 样式(.dark、.light、.systemChromeMaterial 等),但没有什么能让它变得模糊。

This is the kind of blur I'm trying to get

有人能给我指出正确的方向吗?

如果您接受第三方库:

  1. 安装SwiftUIX
  2. 通过修改您的 NavBar .background(VisualEffectBlurView(blurStyle: .systemThinMaterial)) 用几行代码使模糊变得模糊,并且在使用之前不要忘记导入 SwiftUIX。