Swift:TableView Cell下载按钮图片动画减速失败求解决方案
解决TableView Cell按钮动画播放速度过快的问题
咱们先拆解你遇到的两个方法失效的原因,再给出针对性的可行方案:
方法一:修复UIImageView动画速度问题
你用btn.imageView!.animationImages的思路是对的,但漏掉了设置动画总时长!UIImageView默认的animationDuration是每张图间隔0.1秒,4张图的话整个循环仅0.4秒,自然看起来切换飞快。
只需要补充一行代码就能放慢速度:
btn.imageView!.animationImages = [#imageLiteral(resourceName: "unsubscribed2"), #imageLiteral(resourceName: "subbing1"), #imageLiteral(resourceName: "subbing2"), #imageLiteral(resourceName: "subscribed3")] // 设置整个动画循环的总时长,比如设为4秒,每张图就会停留1秒 btn.imageView!.animationDuration = 4.0 // 可选:如果希望动画只播放一次而非循环,加上这行 btn.imageView!.animationRepeatCount = 1 btn.imageView!.startAnimating()
这样动画就会按你设定的节奏缓慢播放,等下载完成触发tableView.reloadData()时,cell会被复用或重建,动画自然就停止了。
方法二:修复UIView.transition循环无效的问题
你用循环触发UIView.transition的问题在于:循环会瞬间把所有动画都塞进队列,它们会同时启动执行,最后只会显示最后一张图的效果,根本看不到依次切换的过程。
如果想用过渡动画实现依次切换,可以用递归或者延迟调度来逐个触发动画:
let arrItems = [#imageLiteral(resourceName: "unsubscribed2"), #imageLiteral(resourceName: "subbing1"), #imageLiteral(resourceName: "subbing2"), #imageLiteral(resourceName: "subscribed3")] // 定义递归函数依次播放动画 func animateButtonImages(at index: Int) { guard index < arrItems.count else { return } UIView.transition(with: btn, duration: 1.0, options: .curveEaseInOut, animations: { self.btn.setImage(arrItems[index], for: .normal) }, completion: { _ in // 延迟1秒后播放下一张,时长可按需调整 DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { self.animateButtonImages(at: index + 1) } }) } // 启动动画 animateButtonImages(at: 0)
这样每张图的过渡动画会依次执行,每张图停留1秒(动画时长+延迟时长),整体速度就慢下来了。
额外注意:TableView Cell复用问题
因为是在TableView Cell中,要避免cell复用导致的动画错乱:
- 可以在自定义Cell的
prepareForReuse方法里停止动画并重置按钮状态:
override func prepareForReuse() { super.prepareForReuse() btn.imageView?.stopAnimating() // 重置按钮为初始状态的图片 btn.setImage(#imageLiteral(resourceName: "unsubscribed2"), for: .normal) }
内容的提问来源于stack exchange,提问作者user2363025
相关产品推荐
相关产品推荐

