Swift 4.1 / Xcode 9.3 / iOS 11.3
您可以通过使用 CADisplayLink 滚动您自己的动画来解决此问题:
将您的图像加载到 UIImage
数组中
var images : [UIImage] = [
UIImage(named: "image1.png"),
UIImage(named: "image2.png"),
...
]
然后,开始动画:
var animationImageFrameIndex : Double = 0
var displayLink : CADisplayLink?
func startAnimation() {
animationImageFrameIndex = 0
displayLink = CADisplayLink(target: self, selector: #selector(animationStep(_:)))
displayLink!.preferredFramesPerSecond = 60
displayLink!.add(to: .current, forMode: .defaultRunLoopMode)
}
preferredFramesPerSecond 是您希望调用 animationStep 方法的所需速率。但是,CADisplayLink 不保证会按照您要求的速率调用它。
animationStep 函数被 CADisplayLink 定期调用,它实际上是在图像之间循环:
@objc func animationStep(_ displayLink: CADisplayLink) {
let desiredFPS : Double = 24
let realFPS = 1 / (displayLink.targetTimestamp - displayLink.timestamp)
material.diffuse.contents = images[Int(animationImageFrameIndex)]
animationImageFrameIndex += desiredFPS / realFPS
if Int(animationImageFrameIndex) >= images.count {
displayLink.remove(from: .current, forMode: .defaultRunLoopMode)
}
}
在上述方法中,desiredFPS 是您实际想要在动画中使用的帧速率。
Bitbucket 上有一个完整的示例项目,here。
您应该能够使用简单的 CAKeyframeAnimation 对此(一系列图像)进行动画处理,但经过多次测试,很明显这不起作用,出现成为Apple方面的错误。有一个来自其他人的开放雷达here,我还提交了一个错误报告。