停止 CAAnimation 以添加另一个 CAAnimation

Posted

技术标签:

【中文标题】停止 CAAnimation 以添加另一个 CAAnimation【英文标题】:Stopping CAAnimation to add another CAAnimation 【发布时间】:2013-07-11 14:40:11 【问题描述】:

我有一个带有 5 个子视图的旋转圆形,我正在对其填充颜色进行动画更改以匹配当前位于顶部的子视图。因此,当我必须更改颜色时,我会从该图层中删除动画,然后像这样添加新的:

[self.dynamicColorCircleLayer removeAllAnimations]; //checked - doesn't matter if line is added or not
        switch (index) 
            case 0: 
                CABasicAnimation *fillColorAnimation = [CABasicAnimation animationWithKeyPath:@"fillColor"];
                fillColorAnimation.duration = 2;
                //fillColorAnimation.fromValue = (id)self.dynamicColorCircleLayer.fillColor;
                fillColorAnimation.toValue = (id)[[UIColor redColor] CGColor];
                fillColorAnimation.removedOnCompletion = NO;
                fillColorAnimation.fillMode = kCAFillModeForwards;
                fillColorAnimation.delegate = self;
                [self.dynamicColorCircleLayer addAnimation:fillColorAnimation forKey:@"fillColor"];

等等

还有委托方法:

- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag 
    self.dynamicColorCircleLayer.fillColor = (__bridge CGColorRef)(((CABasicAnimation*)theAnimation).toValue);

但是,当一个动画尚未结束而我必须开始另一个动画时,新的动画会立即结束。 例如:我正在将颜色从红色变为蓝色,我在动画中间,我必须将颜色变为绿色。动画没有显示,圆圈只是立即将颜色变为绿色。 如果我从 animationDidStop(...) 中删除代码,我会得到一个绿色的动画,但每个动画都将从默认(红色)颜色开始。

用另一个动画打断动画的正确方法是什么?另外,是否可以让新动画从我删除旧动画时的颜色开始? (在上面的示例中,它将动画颜色从红色和蓝色之间的颜色变为绿色)

【问题讨论】:

【参考方案1】:

参考这个问题:

Is there a way to pause a CABasicAnimation?

这里第一个答案说明如何暂停现有动画,第二个答案说明如何停止。

希望这是您正在寻找的。​​p>

【讨论】:

不幸的是,它不能解决我的问题,但 +1 以获得有用的信息。我找到了另一种方法。【参考方案2】:

我找到了一种方法来做到这一点,但是我仍然不知道如何从上一个动画停止的颜色开始下一个动画。这是以防万一有人需要它:

CABasicAnimation *currentAnimation = (CABasicAnimation*)[self.dynamicColorCircleLayer animationForKey:@"fillColor"];
if (currentAnimation != nil) 
    self.dynamicColorCircleLayer.fillColor = (__bridge CGColorRef)(currentAnimation.toValue);

switch (index) 
    case 0: 
        CABasicAnimation *fillColorAnimation = [CABasicAnimation animationWithKeyPath:@"fillColor"];
        fillColorAnimation.duration = 2.5f;
        fillColorAnimation.toValue = (id)[[UIColor redColor] CGColor];
        fillColorAnimation.removedOnCompletion = NO;
        fillColorAnimation.fillMode = kCAFillModeForwards;
        fillColorAnimation.delegate = self;
        [self.dynamicColorCircleLayer addAnimation:fillColorAnimation forKey:@"fillColor"];

        break;
     (...)

在委托方法中:

- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag 
    if (flag) 
        self.dynamicColorCircleLayer.fillColor = (__bridge CGColorRef)(((CABasicAnimation*)theAnimation).toValue);
    

现在,当将颜色变为绿色的动画成功完成或提前中断时,fillcolor 只会变为绿色并在需要时开始下一个动画。

【讨论】:

以上是关于停止 CAAnimation 以添加另一个 CAAnimation的主要内容,如果未能解决你的问题,请参考以下文章

CAAnimation 正在覆盖以前的 CAAnimation 动画

CAAnimation 期间的位置

如何在 animationDidStop 委托中识别 CAAnimation?

添加另一个循环后执行停止(C,Project Hangman)

使用 CAAnimation.CurrentMediaTime() 更改显式动画的速度

如何在 UIView 中使用 CAAnimation 添加波纹动画 [关闭]