我找到了一些解决方法
首先,我放原图
然后在原图上放一张应用高斯滤波的图片
并将 clipShape 添加到过滤后的图像。
clipShape 参数的对象需要像这样确认 Shape 协议
struct MyShape: Shape {
func path(in rect: CGRect) -> Path {
RoundedRectangle(cornerRadius: 10.0).path(...)
}
}
我从
中找到了高斯滤波器代码
https://gist.github.com/Zedd0202/8d3e567161d0c92e7d585bb74e926413#file-applyblur_usingclamp-swift
伪代码
ZStack {
Image("image")
Image("image")
.clipShape(YourShape())
.frame(...)
.padding(...)
}
---
extension UIImage {
func applyBlur_usingClamp(radius: CGFloat) -> UIImage {
let context = CIContext()
guard let ciImage = CIImage(image: self),
let clampFilter = CIFilter(name: "CIAffineClamp"),
let blurFilter = CIFilter(name: "CIGaussianBlur") else {
return self
}
clampFilter.setValue(ciImage, forKey: kCIInputImageKey)
blurFilter.setValue(clampFilter.outputImage, forKey: kCIInputImageKey)
blurFilter.setValue(radius, forKey: kCIInputRadiusKey)
guard let output = blurFilter.outputImage,
let cgimg = context.createCGImage(output, from: ciImage.extent) else {
return self
}
return UIImage(cgImage: cgimg)
}
}
---
struct YourShape: Shape {
func path(in rect: CGRect) -> Path {
RoundedRectangle(cornerRadius: 10.0)
.path(in: CGRect(...))
}
}
然后你会得到这样的东西
更新
看起来小部件有某种内存限制
如果您在真实设备上运行此代码,它可能会崩溃(在我的情况下,大多数时候模拟器都可以工作)
你可以通过调整applyBlur_usingClamp方法的半径值来解决这个问题。 (250 崩溃,100 对我来说没问题)