如何修改UIBlurEffect强度?

Chr*_*eip 14 swift

我不希望我的背景图像过于眩晕.是否有调整模糊强度的属性?

let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.Light)
blurEffect.???
let effectView = UIVisualEffectView(effect: blurEffect)
effectView.frame = backgroundAlbumCover.bounds
backgroundAlbumCover.addSubview(effectView)
Run Code Online (Sandbox Code Playgroud)

bod*_*ich 19

你可以用动画师以超级优雅的方式做到这一点

(减少 UIVisualEffectView alpha 不会影响模糊强度,所以我们必须使用 animator)

用法很简单:

let blurEffectView = BlurEffectView()
view.addSubview(blurEffectView)
Run Code Online (Sandbox Code Playgroud)

BlurEffectView 实现:

class BlurEffectView: UIVisualEffectView {
    
    var animator = UIViewPropertyAnimator(duration: 1, curve: .linear)
    
    override func didMoveToSuperview() {
        guard let superview = superview else { return }
        backgroundColor = .clear
        frame = superview.bounds //Or setup constraints instead
        setupBlur()
    }
    
    private func setupBlur() {
        animator.stopAnimation(true)
        effect = nil

        animator.addAnimations { [weak self] in
            self?.effect = UIBlurEffect(style: .dark)
        }
        animator.fractionComplete = 0.1   //This is your blur intensity in range 0 - 1
    }
    
    deinit {
        animator.stopAnimation(true)
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 似乎是个好主意,但我无法让它在我的项目中发挥作用。每次加载相关视图时我都会崩溃。`线程 1:异常:“释放已暂停或停止的属性动画师是错误的。属性动画师必须完成动画制作或显式停止并完成才能释放。”` (2认同)

pni*_*zle 13

无法调整模糊本身......但是,您可以调整模糊视图的可见度.这可以通过多种方式完成,目前我只能想到其中的三种方式:

第一个选项:调整UIVisualEffectView实例的alpha,例如:

effectView.alpha = 0.4f;
Run Code Online (Sandbox Code Playgroud)

第二个选项:在Index 0处向effectView添加一个UIView实例,并调整此UIView实例的alpha.例如:

UIView *blurDilutionView = [[UIView alloc] initWithFrame: effectView.frame];
blurDilutionView.backgroundColor = [[UIColor whiteColor] colorWithAlphaComponent: 0.5];
blurDilutionView.autoresizingMask = UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleBottomMargin|UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;//if not using AutoLayout
[effectView insertSubview:blurDilutionView atIndex:0];
Run Code Online (Sandbox Code Playgroud)

第三个选项:使用多个UIVisualEffectView实例(我还没有尝试过这个,更多的想法).每个都应用0.1f的alpha值.UIVisualEffectView视图越多,整体外观就越模糊.再一次,我还没有尝试过这个选项!

  • Apple 特别建议不要使用 alpha 来控制模糊效果。[UIVisualEffectView: Setting the Correct Alpha Value](https://developer.apple.com/reference/uikit/uivisualeffectview): _当使用 UIVisualEffectView 类时,避免小于 1 的 alpha 值。......将 alpha 设置为小于 1在视觉效果视图或其任何超视图上会导致许多效果看起来不正确或根本不显示。_ (8认同)
  • 您根本无法通过 alpha 来控制效果强度。您刚刚开始在效果下看到部分完全清晰的视图。 (3认同)

Tun*_*Fam 6

有一次我遇到了创建.light.darkUIBlurEffect 样式更暗和更亮的模糊效果的问题。

要实现这一点,请在背面放置一个带有您需要的颜色和 alpha 的视图:

    let pictureImageView = // Image that you need to blur
    let backView = UIView(frame: pictureImageView.bounds)
    backView.backgroundColor = UIColor(red: 100/255, green: 100/255, blue: 100/255, alpha: 0.3)
    pictureImageView.addSubview(backView)

    let blurEffect = UIBlurEffect(style: .light)
    let blurEffectView = UIVisualEffectView(effect: blurEffect)
    blurEffectView.frame = pictureImageView.bounds
    pictureImageView.addSubview(blurEffectView)
Run Code Online (Sandbox Code Playgroud)

结果如何:

在此处输入图片说明

有关更多详细信息,请查看这篇文章

更新:显然还有另一种不错(甚至更好)的方式来使用CIFilter(name: "CIGaussianBlur"). 它允许使“不透明度”和模糊的强度远低于UIBlurEffect.