Swift视图切换时UIVisualEffectView模糊效果重复增强问题解决
问题根源与解决方法
核心问题:重复叠加模糊视图
每次页面返回时,若viewDidLoad()被重复执行(比如控制器被重新初始化),或你在其他生命周期方法中也执行了创建模糊视图的代码,就会不断生成新的UIVisualEffectView并添加到contenedorPaywall上,多层模糊叠加后自然会越来越模糊。
正确实现方案
1. 将模糊视图声明为控制器属性
避免每次创建新实例,先在控制器类中定义:
class YourViewController: UIViewController { private var blurEffectView: UIVisualEffectView? private var blurAnimator: UIViewPropertyAnimator? // ...其他代码 }
2. 在viewDidLoad()中仅初始化一次
通过判重确保模糊视图只被创建添加一次:
override func viewDidLoad() { super.viewDidLoad() guard blurEffectView == nil else { return } let targetBlurEffect = UIBlurEffect(style: .light) blurEffectView = UIVisualEffectView(effect: nil) // 初始不启用模糊 blurEffectView?.backgroundColor = .clear blurEffectView?.frame = contenedorPaywall.bounds blurEffectView?.autoresizingMask = [.flexibleWidth, .flexibleHeight] contenedorPaywall.addSubview(blurEffectView!) // 初始化动画器,控制模糊过渡效果 blurAnimator = UIViewPropertyAnimator(duration: 0.5, curve: .linear) { [weak self] in self?.blurEffectView?.effect = targetBlurEffect } }
3. 控制动画触发时机(可选)
若需要页面显示时才播放模糊动画,将动画启动逻辑放在viewWillAppear(_:)中,同时在viewWillDisappear(_:)里重置状态,避免返回时重复触发:
override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // 重置动画状态,确保每次进入仅播放一次过渡 blurAnimator?.stopAnimation(true) blurAnimator?.finishAnimation(at: .start) blurAnimator?.startAnimation() } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) blurAnimator?.stopAnimation(true) blurEffectView?.effect = nil // 可选:离开页面时移除模糊效果 }
4. 实现固定强度的半模糊(针对你的需求)
如果你想要的是固定强度的半模糊而非从无到全的过渡,无需用定时器停止动画,直接通过动画器的进度控制模糊程度:
// 在viewDidLoad中初始化时直接设置固定模糊强度 let targetBlurEffect = UIBlurEffect(style: .light) blurEffectView = UIVisualEffectView(effect: nil) // ...其他视图配置代码 blurAnimator = UIViewPropertyAnimator(duration: 1, curve: .linear) { [weak self] in self?.blurEffectView?.effect = targetBlurEffect } // 0-1之间取值,值越小模糊越弱 blurAnimator?.fractionComplete = 0.2
你的修改导致完全模糊的原因
你设置的fractionComplete = 0.185是让动画执行18.5%的进度,此时已有明显模糊效果;同时你仍未解决重复添加模糊视图的问题,多层叠加后自然看起来完全模糊。
内容的提问来源于stack exchange,提问作者Mihail Minkov
相关产品推荐
相关产品推荐

