iOS Swift切换视图控制器后背景渐变动画停止问题求助
解决背景渐变动画切换VC后停止的问题
这个问题我碰到过好多次,核心原因是UIView的动画会和视图的显示状态绑定——当你的视图控制器被切换走(比如push到下一个VC、或者present了模态VC),当前VC的view会被移出活跃的视图层级,系统为了节省性能,会自动暂停甚至取消这类动画。下面给你几个靠谱的解决思路:
方案一:改用Core Animation(推荐)
直接基于CALayer做动画,Core Animation的动画是附加在图层上的,只要图层没有被销毁(比如当前VC还在导航栈里),动画就会持续运行,不受视图显示状态的影响。
替换你原来的animateGrandient函数:
func animateGradient() { // 先移除之前的动画,避免重复添加导致冲突 gradientView.layer.removeAnimation(forKey: "gradientTranslation") let translationAnimation = CABasicAnimation(keyPath: "transform.translation.x") // 计算目标偏移量 let targetX = -(gradientView.frame.width - view.frame.width) translationAnimation.fromValue = 0 translationAnimation.toValue = targetX translationAnimation.duration = 15 translationAnimation.repeatCount = .infinity translationAnimation.autoreverses = true translationAnimation.timingFunction = CAMediaTimingFunction(name: .linear) gradientView.layer.add(translationAnimation, forKey: "gradientTranslation") }
额外注意:
- 在VC销毁时记得移除动画,避免内存泄漏:
deinit { gradientView.layer.removeAnimation(forKey: "gradientTranslation") }
- 这个方案的优势是动画会持续运行,哪怕你切到其他VC再切回来,动画会从当前状态继续,不会从头开始。
方案二:利用VC生命周期重启动画
如果你还是想使用UIView的动画API,可以在视图即将显示时重启动画,即将消失时停止:
override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) animateGradient() } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) // 停止所有关联到gradientView的动画 gradientView.layer.removeAllAnimations() }
缺点:
每次切回这个VC时,动画都会从头开始,无法延续之前的进度,体验不如方案一。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

