我有一个UIButton,按下它应该通过一组图像为其图标设置动画并停在最后。
我所拥有的是以下内容:
let loadingImages = (1...8).map { UIImage(named: "slice\($0)")! }
let animatedImage = UIImage.animatedImage(with: loadingImages, duration: 1.5)
sender.setImage(animatedImage, for: UIControlState.normal)
设置图像后,我可以设置一个计时器,可以将图像设置为最后一个图像。但我认为它不是非常精确,也不是很好的代码。
是否有更好的方法可以将图标从其初始状态图像1(30)设置为最终图像30(30)停止?
编辑:@ the4kman建议将此作为stop UIimageview animation at last image
的副本关闭不是!该问题使用UIImageView,这个问题使用UIButton。这个问题适用于Objective-C,这个问题适用于Swift 3.它能解决我的问题吗?不,目前一个upvote的答案与我建议用计时器一样。所以不,这是一个不同的问题!
答案 0 :(得分:1)
将UIImageView添加到按钮是我能想到的最简单的方法。但仍然检测动画完成是你需要处理的事情。我创建了一个UIImageView的子类,让你知道动画何时结束。
class AnimatedImageView: UIImageView, CAAnimationDelegate {
var completion: ((_ completed: Bool) -> Void)?
func startAnimate(completion: ((_ completed: Bool) -> Void)?) {
self.completion = completion
if let animationImages = animationImages {
let cgImages = animationImages.map({ $0.cgImage as AnyObject })
let animation = CAKeyframeAnimation(keyPath: "contents")
animation.values = cgImages
animation.repeatCount = Float(self.animationRepeatCount)
animation.duration = self.animationDuration
animation.delegate = self
self.layer.add(animation, forKey: nil)
} else {
self.completion?(false)
}
}
func animationDidStop(_ anim: CAAnimation, finished flag: Bool) {
completion?(flag)
}
}
这是怎么用的 设置将运行动画的图像视图并将其添加到按钮
var imageView: AnimatedImageView()
......
let loadingImages = (1...8).map { UIImage(named: "slice\($0)")! }
imageView.frame = button.bounds
imageView.image = loadingImages.first
imageView.animationImages = loadingImages
imageView.animationDuration = 1.5
imageView.animationRepeatCount = 1
yourButton.addSubview(imageView)
单击按钮时
imageView.startAnimate { (completed) in
imageView.image = images.last
}