单击

时间:2017-08-29 13:54:43

标签: ios swift swift3

我有一个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的答案与我建议用计时器一样。所以不,这是一个不同的问题!

1 个答案:

答案 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
}