swift 修复白色背景上的灰色UIVisualEffectView额外灯光模糊

ckx4rj1h  于 2023-01-08  发布在  Swift
关注(0)|答案(9)|浏览(367)

Apple提供了这种实时模糊视图类UIVisualEffectView,您可以将其与UIBlurEffect一起使用,UIBlurEffect采用三种可用UIBlurEffectStyle之一:

enum UIBlurEffectStyle : Int {
    case ExtraLight
    case Light
    case Dark
}

现在,出于演示目的,我设置了两个样式为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)

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

还有一些关于颜色的工作
第一节第一节第一节第二节第一节
但是当涉及到白色背景时,会发生这种情况:

左侧的Light效果按预期工作,但右侧的ExtraLight效果会留下某种灰色方块。
现在的问题是:有没有什么技巧或方法可以让我在白色背景上使用额外的灯光模糊效果(支持实时模糊),并消除丑陋的灰色阴影?

q5lcpyga

q5lcpyga1#

据我所知,附加色调是UIVisualEffectView类的一个内置特性,如果用Xcode检查视图层次结构,可以看到在视觉效果视图示例中有两个默认的子视图:UIVisualEffectBackdropViewUIVisualEffectSubview。(我假设它们是私有类。)如果检查UIVisualEffectSubview,您可以看到它有一个背景色,这导致了您注意到的不需要的色调。
我不确定是否有官方支持的方法来移除它,但是你可以通过过滤私有子视图的名称来修改这个背景颜色:

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

(Swift 5兼容)
默认色调大约为70%不透明度,因此最简单的方法是使用具有0.7 Alpha分量的目标背景色。
我还注意到,如果视觉效果包含自定义子视图,这可能会重置为默认值。如果我将相同的代码段添加到视图控制器的viewDidLayoutSubviews函数中,那么即使在更新内置子视图后,它也会保持自定义背景色。
下面是一个暗模糊效果样式的例子。顶部显示默认的色调,底部显示自定义的黑色背景色,不透明度为70%。

vsaztqbk

vsaztqbk2#

如果你只想要模糊效果,而你的模糊视图是固定的,你可以使用UIImageEffects类,并将tintColor更改为“全”白色:

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

据我所知,你不能改变它在UIVisualEffectView

z2acfund

z2acfund3#

您可以尝试:

var visualEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .Light))    
visualEffectView.frame = imageView.bounds
imageView.addSubview(visualEffectView)
qojgxg4l

qojgxg4l4#

简单的解决方案

Shannon Hughes' Blog Post的启发,我可以找到一个简单的解决方案。只需在效果视图中添加一个透明的白色背景色。我不知道它是否与extraLight完全一样,但对我来说,它已经足够接近了。

let visualEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .light))
visualEffectView.frame = sectionHeaderView.bounds
visualEffectView.backgroundColor = UIColor(white: 1.0, alpha: 0.9)
sectionHeaderView.addSubview(visualEffectView)
w8biq8rn

w8biq8rn5#

下面的代码应该可以为它提供所需的色调:

let visualEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .regular))
visualEffectView.subviews.forEach { subview in
    subview.backgroundColor = UIColor.blue.withAlphaComponent(0.2)
}
    • 重要说明:**

我不建议为"_UIVisualEffectSubview"添加一个检查,因为这个类可能会在后续的iOS更新中更改。此外,应用程序可能会因此而被拒绝。

bybem2ql

bybem2ql6#

iOS 15拥有

.background(.ultraThinMaterial)

但它仍然遭受讨厌的灰色色调。希望有一个选项,模糊背景视图没有任何色调。
我尝试了一个简单的颜色修正技巧,它可以修正我的背景颜色,但只在亮模式下有效!对于暗模式,我只把背景做成纯黑色(没有半透明的模糊)

.background(
    // negate the slight grey tint of ultrathinmaterial
    Color("materialTintColorCorrect")
        .background(.ultraThinMaterial)
)

我的“materialTintColorCorrect”颜色资源是#F0F8FF 27%的不透明度用于浅色模式,#000000 100%的不透明度用于深色模式。

zxlwwiss

zxlwwiss7#

let vc = UIViewController()
vc.view.frame = self.view!.frame
let efv = UIVisualEffectView(effect: UIBlurEffect(style: UIBlurEffectStyle.light))
efv.frame = vc.view.frame
vc.view.addSubview(efv)
self.addChildViewController(vc)
self.view.addSubview(vc.view)
// below method has a bug
// self.present(vc, animated: true, completion:nil)
wlsrxk51

wlsrxk518#

我建议将extraLightView添加到UIColor(white: 1.0, alpha: 0.x)视图中,其中x可以根据滚动视图的contentOffset进行修改。当视图后面没有任何内容时,x为1时,extraLightView将为白色。当您滚动并修改x时,不会修改UIVisualEffectView(这是非常不鼓励的),而是它的父视图,这是完全安全的。

cgh8pdjw

cgh8pdjw9#

与Swift 5配合使用

当背景视图为白色时,我使视觉效果视图完全为白色的方法。

let blurView = UIVisualEffectView(effect: UIBlurEffect(style: .light))
blurView.backgroundColor = UIColor.white.withAlphaComponent(0.7)

相关问题