0

我有一个带有 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(...) 中删除代码,我会得到一个绿色的动画,但每个动画都将从默认(红色)颜色开始。

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

4

2 回答 2

1

参考这个问题:

有没有办法暂停 CABasicAnimation?

这里第一个答案解释了如何暂停现有动画,第二个答案解释了如何停止相同的动画。

希望这是您正在寻找的。

于 2013-07-11T14:49:13.683 回答
0

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

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 只会变为绿色并在需要时开始下一个动画。

于 2013-07-12T09:47:14.190 回答