Swift 5 如何调整UIBlurEffect实现的UIView模糊深度(半径)
Swift 调整UIVisualEffectView模糊深度方案
原生UIBlurEffect默认不直接暴露修改模糊半径的公开API,可根据你的最低兼容iOS版本选择对应实现方案:
方案1:iOS 15+ 官方原生方案(最稳定)
iOS 15及以上系统苹果提供了支持自定义模糊半径的构造方法,直接传入你需要的半径数值即可,数值越小模糊度越低:
override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) guard #available(iOS 15.0, *) else { return } // 第二个参数radius为模糊半径,系统默认light样式模糊半径约为20,可自行调小降低模糊度 let blurEffect = UIBlurEffect(style: .light, radius: 10) let blurView = UIVisualEffectView(effect: blurEffect) blurView.translatesAutoresizingMaskIntoConstraints = false view.insertSubview(blurView, at: 0) NSLayoutConstraint.activate([ blurView.topAnchor.constraint(equalTo: view.topAnchor), blurView.leadingAnchor.constraint(equalTo: view.leadingAnchor), blurView.heightAnchor.constraint(equalTo: view.heightAnchor), blurView.widthAnchor.constraint(equalTo: view.widthAnchor) ]) }
方案2:全版本兼容Hack方案
如果需要兼容iOS 15以下版本,可以利用UIVisualEffectView的动画过渡特性,让模糊效果停在从无到有过程的中间状态,间接控制模糊深度:
override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) let blurEffect = UIBlurEffect(style: .light) // 初始效果设为nil,后续通过动画控制进度 let blurView = UIVisualEffectView(effect: nil) blurView.translatesAutoresizingMaskIntoConstraints = false view.insertSubview(blurView, at: 0) NSLayoutConstraint.activate([ blurView.topAnchor.constraint(equalTo: view.topAnchor), blurView.leadingAnchor.constraint(equalTo: view.leadingAnchor), blurView.heightAnchor.constraint(equalTo: view.heightAnchor), blurView.widthAnchor.constraint(equalTo: view.widthAnchor) ]) // 模糊比例取值范围0~1,0为完全不模糊,1为系统默认最大模糊度 let blurProgress: CGFloat = 0.3 UIView.animate(withDuration: 0, delay: 0, options: .allowUserInteraction) { blurView.effect = blurEffect } completion: { _ in blurView.layer.speed = 0 blurView.layer.timeOffset = blurProgress } }
注意事项:
- 该方案属于非官方用法,存在后续系统版本更新后失效的风险
- 后续需要调整模糊度时,直接修改
blurProgress数值即可
方案3:自定义高斯模糊实现
如果对模糊效果可控性要求更高,可以对目标视图截图后使用CoreImage的高斯模糊滤镜自行处理,完全自定义模糊半径,不受系统版本限制,缺点是性能低于系统原生UIVisualEffectView,不适合频繁刷新的场景。
内容的提问来源于stack exchange,提问作者user15415235
相关产品推荐
相关产品推荐

