You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 03:25:29