UIVisualEffectView在iOS 14小部件中不起作用

问题描述

我放在一张图片上,它填充了小部件视图。

我做了一个小视图,希望该视图显示背后图像的模糊图像。

(图像和小视图在ZStack中)

我只用了很少的代码(类似于Is there a method to blur a background in SwiftUI?中的选项2)

但结果就像

enter image description here

我认为黄色框表示“ VisualEffectView在WidgetKit中不起作用。”

所以我想知道是否还有其他技术来显示在图像后面模糊的小视图?

解决方法

我认为黄色框表示“ VisualEffectView在 WidgetKit。'

是的,特别是因为您不能在小部件中使用UIViewRepresentable。参见:

这意味着唯一的选择是使用SwiftUI代码。可能的解决方案在此处(选项1):

struct WidgetEntryView: View {
    var entry: Provider.Entry

    var body: some View {
        ZStack {
            Image("testImage")
                .blur(radius: 10)
        }
        .edgesIgnoringSafeArea(.all)
    }
}
,

我找到了一些解决方法

首先,我放原始图片

然后在原始图片上放置应用了高斯滤波器的图片

并将clipShape添加到已过滤的图像。

clipShape参数的对象需要确认Shape协议,如

sMessage = "print('hello world')"
var1 = eval(sMessage)
await message.channel.send(var1)

我从中找到了高斯滤波器代码

https://gist.github.com/Zedd0202/8d3e567161d0c92e7d585bb74e926413#file-applyblur_usingclamp-swift

伪代码

struct MyShape: Shape {
  func path(in rect: CGRect) -> Path {
    RoundedRectangle(cornerRadius: 10.0).path(...)
  }
}

那么你会得到这样的东西 enter image description here

更新

看起来小部件具有某种内存限制

如果您在真实设备上运行此代码,则可能会崩溃(就我而言,大多数时间模拟器都可以找到)

您可以通过调整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(...)) } } 方法的半径值来解决此问题。 (崩溃了250个,对我来说100个很好)