我使用iOS 8.1设置了一个非常简单的单视图应用程序(在Swift中)。我在主视图控制器视图中添加了一个UIImageView。我正在尝试使用CAKeyframeAnimation来动画一系列图像。我最初使用UIImageView animationImages属性工作正常,但我需要能够准确知道动画何时完成,因此转移到CAKeyframeAnimation。
我的代码如下:
class ViewController: UIViewController {
@IBOutlet weak var imageView: UIImageView!
var animation : CAKeyframeAnimation!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let animationImages:[AnyObject] = [UIImage(named: "image-1")!, UIImage(named: "image-2")!, UIImage(named: "image-3")!, UIImage(named: "image-4")!]
animation = CAKeyframeAnimation(keyPath: "contents")
animation.calculationMode = kCAAnimationDiscrete
animation.duration = 25
animation.values = animationImages
animation.repeatCount = 25
animation.removedOnCompletion = false
animation.fillMode = kCAFillModeForwards
self.imageView.layer.addAnimation(animation, forKey: "contents")
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
问题是动画没有显示任何图像,我只是收到一个空白屏幕。上面的代码中是否有我遗漏的东西?如何才能显示动画?
答案 0 :(得分:7)
这条线永远不会起作用:
animation.values = animationImages
将其更改为:
animation.values = animationImages.map {$0.CGImage as AnyObject}
原因是您正在尝试为此图层的"contents"
键设置动画。但那是contents
属性。但contents
属性必须设置为CGImage,而不是UIImage。相比之下,animationImages
包含UIImages,而不是CGImages。
因此,您需要将UIImage数组转换为CGImage数组。此外,您正在尝试将此数组传递给Objective-C,其中NSArray必须仅包含对象;由于CGImage不是Objective-C中的一个对象,因此需要将它们作为AnyObject进行转换。这就是我的map
电话。