var body: some View {
return
ZStack {
Image("background_2").resizable()
.edgesIgnoringSafeArea(.all)
.blur(radius: 5)
.scaledToFill()
.padding(-20) //Trick: To escape from white patch @top & @bottom
}
}
open class UIBackdropView: UIView {
open override class var layerClass: AnyClass {
NSClassFromString("CABackdropLayer") ?? CALayer.self
}
}
public struct Backdrop: UIViewRepresentable {
public init() {}
public func makeUIView(context: Context) -> UIBackdropView {
UIBackdropView()
}
public func updateUIView(_ uiView: UIBackdropView, context: Context) {}
}
public struct Blur: View {
public var radius: CGFloat
public var opaque: Bool
public init(radius: CGFloat = 3.0, opaque: Bool = false) {
self.radius = radius
self.opaque = opaque
}
public var body: some View {
Backdrop()
.blur(radius: radius, opaque: opaque)
}
}
用法
struct Example: View {
var body: some View {
ZStack {
YourBelowView()
YourTopView()
.background(Blur())
.background(Color.someColor.opacity(0.4))
}
}
}
9条答案
按热度按时间dy2hfwbg1#
1.原生SwiftUI方式:
只需添加
.blur()
修改器上的任何你需要模糊像:注意视图的顶部和底部
请注意您可以
Group
多个视图并将它们模糊在一起。2.特效视图:
您可以从UIKit中获取完美的
UIVisualEffectView
:使用这个小结构:
3. iOS 15:材料
您可以使用iOS预定义材质,只需一行代码:
qncylg1j2#
我还没有在SwiftUI中找到实现这一点的方法,但是你可以通过
UIViewRepresentable
协议使用UIKit。Demo:
我使用
ZStack
将视图放在它上面。最后看起来像这样:
aiazj4mn3#
最简单的方法是Richard Mullinix的here:
然后在代码中的某个地方使用它,比如background:
tf7tbtn24#
iOS 15中的新功能
SwiftUI
与UIVisualEffectView
有一个非常简单的等价物,它结合了ZStack
、background()
修饰符和一系列内置材质。您可以使用几种材质类型之一来调整材质的“厚度”-背景内容的亮度。从最薄到最厚,它们是:
dfuffjeb5#
正如@mojtaba所提到的,当你设置
resizable()
沿着blur()时,在图像顶部看到白色阴影是非常奇怪的。一个简单的技巧是将Image padding提升到-ve。
结果:x1c 0d1x
zsbz8rwp6#
我发现了一个有趣的黑客来解决这个问题。我们可以使用
UIVisualEffectView
来制作其背景的实时“快照”。但是这个“快照”将具有UIVisualEffectView
的应用效果。我们可以使用UIViewPropertyAnimator
来避免应用这种效果。我没发现这个黑客有任何副作用。你可以在这里找到我的解决方案:my GitHub Gist
代码
用法
oo7oh9g97#
使用“不透明:true”与模糊功能将消除白色噪声
2uluyalo8#
有一个非常有用但不幸的私有(感谢Apple)类
CABackdropLayer
它绘制了下面图层的副本,我发现它在使用
blend mode
或滤镜时很有用,它也可以用于模糊效果代码
用法
Source
mfuanj7w9#