使用UIImages的CAKeyframeAnimation不起作用

时间:2012-08-08 17:36:28

标签: ios core-animation cakeyframeanimation

我正在设置动画:

self.testAnimation = [CAKeyframeAnimation animationWithKeyPath:@"TestAnimation"];

[self.animationImagesAsCGImages addObject:( id )[UIImage imageNamed:@"c1.png"].CGImage];
[self.animationImagesAsCGImages addObject:( id )[UIImage imageNamed:@"c2.png"].CGImage];
[self.animationImagesAsCGImages addObject:( id )[UIImage imageNamed:@"c3.png"].CGImage];
[self.animationImagesAsCGImages addObject:( id )[UIImage imageNamed:@"c4.png"].CGImage];

[self.animationKeyframeTimings addObject:[NSNumber numberWithFloat:0.0f]];
[self.animationKeyframeTimings addObject:[NSNumber numberWithFloat:0.25f]];
[self.animationKeyframeTimings addObject:[NSNumber numberWithFloat:0.5f]];
[self.animationKeyframeTimings addObject:[NSNumber numberWithFloat:0.75f]];

self.testAnimation.values          = self.animationImagesAsCGImages;
self.testAnimation.keyTimes        = self.animationKeyframeTimings;

self.testAnimation.repeatCount     = HUGE_VALF;
self.testAnimation.autoreverses    = NO;
self.testAnimation.calculationMode = kCAAnimationDiscrete;
self.testAnimation.duration        = 2.0f;

然后将其称为:

[self.layer addAnimation:self.testAnimation forKey:@"TestAnimation"];

但没有任何显示。

我见过几篇关于kCAAnimationDiscrete的其他Stack帖子,需要第一个时间为0.0f,正如你所看到的那样。

请指教?

1 个答案:

答案 0 :(得分:13)

tl; dr:将动画密钥路径更改为contents,如下所示:

self.testAnimation = [CAKeyframeAnimation animationWithKeyPath:@"contents"];

为什么它不起作用

当您编写[CAKeyframeAnimation animationWithKeyPath:@"TestAnimation"];时,您正试图为不存在的图层上的TestAnimation属性设置动画。因此,对该属性的任何更改都没有视觉效果。

animationWithKeyPath: vs addAnimation:forKey:

创建动画时{1}}和动画添加到图层时keyPath之间的差异并不罕见。

创建新动画时,您可以指定应设置动画的属性的keyPath。如果在没有keyPath的情况下创建动画,则可以使用动画上的keyPath属性进行设置。

向图层添加动画时,您可以指定一个键。此键仅用于使用CALayer上的animationForKey:方法访问动画。

如何使其发挥作用

由于您要在图像中添加图像,我假设您要在图像之间设置动画,在这种情况下,您应该使用key属性作为关键路径。

来自contents属性的文档:

  

提供图层内容的对象。动画。

     

contents

     

您可以将此属性设置为...,以显示图像的内容以代替图层的内容。