如何在SwiftUI中剪裁背景模糊

如何在SwiftUI中剪裁背景模糊,swiftui,blur,clip,Swiftui,Blur,Clip,我试图有一个半透明的模糊覆盖视图,但模糊创建一个模糊的边缘,我希望它是尖锐的概述覆盖形状,即剪辑它 struct TestBlur : View { var body : some View { HStack { VStack { Spacer() Text("Hello World") Spacer() }

我试图有一个半透明的模糊覆盖视图,但模糊创建一个模糊的边缘,我希望它是尖锐的概述覆盖形状,即剪辑它

struct TestBlur : View {
    var body : some View {
        HStack {
            VStack {
                Spacer()
                Text("Hello World")
                Spacer()
            }
            .frame(width: 128)
            .background(Color.red.opacity(0.5).blur(radius: 16).clipShape(Rectangle()))
            Spacer()
        }
        .background(Color.yellow)
    }
}

我希望红色覆盖的边缘是这样的:

本质上,我希望红色视图模糊其下方的任何内容,并具有锐利的边缘:

使用@Asperi的
BackgroundBlurView
也不起作用,没有进行模糊处理(可能我没有使用此权限):

var主体:一些视图{
ZStack{
VStack{
ForEach(0..UIView{
let view=UIVisualEffectView(效果:UIBlurEffect(样式:。灯光))
DispatchQueue.main.async{
view.superview?.superview?.backgroundColor=.clear
}
返回视图
}
func updateUIView(uiView:uiView,context:context){}
}
看起来像这样(缺少模糊):

我不清楚你想实现什么,你能演示一下吗?我认为代码在捕获我想要的东西时并不准确:我希望红色视图下的部分是半透明的,并模糊其下可见的所有内容。剪辑与screenshot2上的Xcode 12.1/iOS 14.1一样适用于screenshot3。对于screenshot3,我认为更适合于use UIVisualEffectView,如中所示。@andrewz您不应该更改
UIVisualEffectView
@aheze的alpha,您是对的-如果我不更改不透明度,则可以工作。但是,我无法调整透明度。这是一个解决方案。我不清楚您试图实现什么,您能演示一下吗?我认为代码在捕获什么方面不准确我希望:我希望红色视图下的部分是半透明的,并模糊其下可见的所有内容。剪辑与screenshot2上的Xcode 12.1/iOS 14.1一样适用于screenshot2。对于screenshot3,我认为更适合使用UIVisualEffectView,如中所示。@andrewz您不应该更改
UIVisualEffectView
@aheze的alpha。您是对的-w如果我不改变不透明度的话,我就不能改变透明度。这是一个解决方案。
    var body : some View {
        ZStack {
            VStack {
                ForEach(0..<40) { i in
                    Text("ABCDEFGHIKLMNOPQRSTUVWXYZ ABCDEFGHIKLMNOPQRSTUVWXYZ ABCDEFGHIKLMNOPQRSTUVWXYZ ABCDEFGHIKLMNOPQRSTUVWXYZ ABCDEFGHIKLMNOPQRSTUVWXYZ ")
                }
                .rotationEffect(Angle.init(degrees: 0))
            }
            .opacity(0.9)
            .background(Color.yellow)
            
            HStack {
                // Trying to make the below VStack have a semi-transparent background and blur all content below it
                // but the VStack needs to have a sharp edge, not fuzzy.
                VStack {
                    Spacer()
                    Text("Hello World")
                    Spacer()
                }
                .frame(width: 128)
                .background(Color.red.opacity(0.5))
                .background(BackgroundBlurView().opacity(0.8))
                Spacer()
            }
        }
    }

struct BackgroundBlurView: UIViewRepresentable {
    func makeUIView(context: Context) -> UIView {
        let view = UIVisualEffectView(effect: UIBlurEffect(style: .light))
        DispatchQueue.main.async {
            view.superview?.superview?.backgroundColor = .clear
        }
        return view
    }

    func updateUIView(_ uiView: UIView, context: Context) {}
}