停止 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 动画
如何在 animationDidStop 委托中识别 CAAnimation?
添加另一个循环后执行停止(C,Project Hangman)