【问题标题】:Stopping CAAnimation to add another CAAnimation停止 CAAnimation 以添加另一个 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(...) 中删除代码,我会得到一个绿色的动画,但每个动画都将从默认(红色)颜色开始。

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

【问题讨论】:

    标签: iphone ios objective-c calayer caanimation


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-22
      • 1970-01-01
      • 2012-03-09
      • 1970-01-01
      • 2012-07-23
      • 1970-01-01
      • 2012-12-06
      • 1970-01-01
      相关资源
      最近更新 更多