修复UIVisualEffectView额外的光模糊在白色背景上是灰色的

Fin*_*ida 10 ios swift uivisualeffectview

Apple提供了这个实时模糊视图类UIVisualEffectView,你可以使用它UIBlurEffect来获取三个可用UIBlurEffectStyle的一个:

enum UIBlurEffectStyle : Int {
    case ExtraLight
    case Light
    case Dark
}
Run Code Online (Sandbox Code Playgroud)

现在用于演示目的我建立与风格两个花纹的意见LightExtraLight:

let lightBlur = UIBlurEffect(style: UIBlurEffectStyle.Light)
let extraLightBlur = UIBlurEffect(style: UIBlurEffectStyle.ExtraLight)

let lightView = UIVisualEffectView(effect: lightBlur)
lightView.frame = CGRectMake(10, 30, 150, 150)
self.view.addSubview(lightView)

let extraLightView = UIVisualEffectView(effect: extraLightBlur)
extraLightView.frame = CGRectMake(160, 30, 150, 150)
self.view.addSubview(extraLightView)
Run Code Online (Sandbox Code Playgroud)

到目前为止一切顺利,一切都按预期工作,它们模糊图像:

图片

还有一些关于颜色的工作:

黑色 红色

但是当遇到白色背景时会发生这种情况:

白色

Light对预期左侧的作品,但效果ExtraLight右侧叶效果某种灰色方块的后面.

现在的问题是:是否有任何一种技巧或方法可以让我在白色背景上使用额外的光线模糊效果(支持实时模糊)并删除那个丑陋的灰色阴影?

End*_*nke 9

据我所知,附加色调是UIVisualEffectView该类的内置功能。如果您使用 Xcode 检查视图层次结构,您可以看到视觉效果视图实例中有两个默认子视图:UIVisualEffectBackdropViewUIVisualEffectSubview. (我假设这些是私有类。)如果您检查,UIVisualEffectSubview您可以看到它具有导致您注意到的不需要的色调的背景颜色。

我不确定是否有官方支持的删除它的方法,但是您可以通过过滤到私有子视图的名称来修改此背景颜色:

if let vfxSubView = visualEffectView.subviews.first(where: {
    String(describing: type(of: $0)) == "_UIVisualEffectSubview"
}) {
    vfxSubView.backgroundColor = UIColor.white.withAlphaComponent(0.7)
}
Run Code Online (Sandbox Code Playgroud)

(兼容 Swift 5)

默认色调约为 70% 不透明度,因此最简单的方法是使用具有 0.7 alpha 分量的目标背景颜色。

我还注意到,如果视觉效果包含自定义子视图,这可能会重置为默认值。如果我将这个相同的片段添加到viewDidLayoutSubviews视图控制器的函数中,那么即使在内置子视图更新后,它也会保持自定义背景颜色。

这是一个带有深色模糊效果样式的示例。顶部显示默认色调,底部版本具有自定义黑色背景色,不透明度为 70%。

在此处输入图片说明

  • 我不太喜欢操纵隐藏的 iOS 子视图,但这种方法看起来足够安全,而且确实有效! (3认同)
  • @JeremLachkar 我认为他们不会拒绝它。是的,UIVisualEffectSubview 是私有类型,但此代码片段并未引用该符号,它仅检查视图的字符串描述,我怀疑 Apple 是否正在审查过程中考虑这些内容。此外,我还使用此代码交付了几个应用程序,没有遭到拒绝。 (2认同)

len*_*rtk 3

如果你只是想要模糊并且你的模糊视图将是静止的,你可以使用该类UIImageEffects并将其更改tintColor为“全”白色:

- (UIImage *)applyExtraLightEffect
{
    UIColor *tintColor = [UIColor colorWithWhite:0.97 alpha:0.82];
    return [self applyBlurWithRadius:20 tintColor:tintColor saturationDeltaFactor:1.8 maskImage:nil];
}
Run Code Online (Sandbox Code Playgroud)

据我所知你无法在UIVisualEffectView.