CAKeyframeAnimation:内容在停止时更改回第一个图像

时间:2012-08-22 11:47:29

标签: ios quartz-graphics caanimation cakeyframeanimation

使用以下代码为CALayer的内容添加动画效果:

CAKeyframeAnimation *countanimation = [CAKeyframeAnimation animation];
NSArray *images = [NSArray arrayWithObjects:(id)[UIImage imageNamed:@"number3"].CGImage, 
                        (id)[UIImage imageNamed:@"number2"].CGImage, 
                        (id)[UIImage imageNamed:@"number1"].CGImage, nil];
[countanimation setKeyPath:@"contents"];
[countanimation setValues:images];
[countanimation setCalculationMode:kCAAnimationDiscrete];
[countanimation setDuration:3.0f];
[countanimation setDelegate:self];
[countanimation setAutoreverses:NO];
[countanimation setRemovedOnCompletion:NO];
[countanimation setValue:@"Countdown" forKey:@"name"];
[countDown addAnimation:countanimation forKey:nil];

想要在动画停止时隐藏图层:

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
{
    if([[anim valueForKey:@"name"] isEqual:@"Countdown"])
    {
        [countDown setHidden:YES];
        ...
    }
}

问题是图层在原始图像(数字3)处闪烁一次,之后隐藏。

我想知道为什么即使我将removedOnCompletion设置为NO,图层也会恢复原始图层。

4 个答案:

答案 0 :(得分:4)

您可以将FillMode属性与removedOnCompletion属性结合使用,在repeatCount结束后将第一帧设置回其内容。

[countanimation setFillMode:kCAFillModeBoth];
[countanimation setRemovedOnCompletion:NO];

我认为这两行代码可以帮助您获得所需的结果。

答案 1 :(得分:1)

我使用animation.fillMode = kCAFillModeForwards;来解决此问题

答案 2 :(得分:0)

我将原始图像替换为number1,问题解决了。

答案 3 :(得分:0)

快速4 + 5

更新Jami对Swift 4和5的回答

colorAnimation.fillMode = .both
colorAnimation.isRemovedOnCompletion = false