如何在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) {}
}