点击添加按钮返回后闪烁按钮停止闪烁的异常问题及代码咨询
问题分析与解决方案
问题原因
从你描述的现象和提供的代码来看,核心问题出在循环动画的生命周期失控以及手动属性设置与动画帧的冲突上:
- 你用
UIView.animate添加的.repeat+.autoreverse动画会持续循环修改按钮的alpha值。当你点击按钮手动设置alpha = 1.0时,动画并没有停止,后续的动画帧会立刻覆盖你手动设置的属性,导致按钮无法稳定保持浅色调。 - 当跳转到新页面再返回时,原页面的视图控制器生命周期触发后,未被停止的循环动画可能会重新激活,或者在后台持续运行,最终导致返回后按钮继续闪烁,无法维持预期的浅色调状态。
解决方法
我们需要用可手动控制的动画对象替代一次性的UIView.animate,同时在视图生命周期节点精准管理动画状态,确保按钮行为符合预期:
1. 用UIViewPropertyAnimator管理可控制的闪烁动画
首先在视图控制器中定义一个动画属性,用来追踪和控制闪烁动画:
private var pulseAnimator: UIViewPropertyAnimator?
然后编写初始化并启动闪烁动画的方法(用手动循环替代系统的.repeat选项,实现更精准的控制):
private func startPulseAnimation() { pulseAnimator = UIViewPropertyAnimator(duration: 0.8, curve: .easeIn) { self.checkAvalibilityBtn.alpha = 0.2 } // 设置自动反转并循环执行 pulseAnimator?.addCompletion { _ in UIView.animate(withDuration: 0.8, curve: .easeOut) { self.checkAvalibilityBtn.alpha = 1.0 } completion: { [weak self] _ in self?.startPulseAnimation() } } pulseAnimator?.startAnimation() }
2. 处理按钮点击事件
点击闪烁按钮时,立即停止动画并固定为浅色调:
@IBAction func checkAvalibilityBtnTapped(_ sender: UIButton) { pulseAnimator?.stopAnimation(true) // 立即终止动画 pulseAnimator?.finishAnimation(at: .current) // 完成当前动画帧 checkAvalibilityBtn.alpha = 0.2 // 固定为浅色调 }
3. 管理页面跳转时的动画状态
在视图控制器生命周期方法中,处理动画的启停,避免页面跳转后动画失控:
override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) pulseAnimator?.stopAnimation(true) // 离开页面时强制停止动画 } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // 根据按钮当前状态决定是否重启动画:如果已经是浅色调则不启动 if checkAvalibilityBtn.alpha != 0.2 { startPulseAnimation() } }
4. 确保返回后的状态稳定
当你从新页面选择名称返回后,按钮已经被设置为浅色调(点击按钮时的操作),此时viewWillAppear会检查按钮的alpha值,不会重新启动动画,从而保持按钮的浅色调且停止闪烁。
额外提示
- 在闭包中使用
[weak self]避免循环引用,防止内存泄漏。 - 如果需要更可靠的状态记录,可以添加一个布尔属性
isButtonActivated来标记按钮是否已被点击,在viewWillAppear时根据这个标记来设置按钮状态和动画,比单纯依赖alpha值更稳妥。
内容的提问来源于stack exchange,提问作者SCS
相关产品推荐
相关产品推荐

