CAShapeLayer动画的完成块

时间:2014-09-09 21:38:25

标签: ios objective-c core-animation calayer

我有一个包含8个CAShapeLayer对象的NSArray。我的目标是在一定时间内将填充颜色从一个设置为另一个,然后再次调用相同的方法。它似乎几乎可以工作,但持续时间没有被考虑。这是代码,也许你可以帮忙吗?

[CATransaction begin];

for (int i = 0; i < MAX_NUM_LIGHTS; i++)
{
    NSUInteger c = [colorsArray count];

    CAShapeLayer *l = (CAShapeLayer*)llayers[i];

    // the fill color after the anim is complete
    [l setFillColor:((UIColor*)colorsArray[(i+index)%c]).CGColor];

    CABasicAnimation *fillColorAnimation = [CABasicAnimation animationWithKeyPath:@"fillColor"];
    fillColorAnimation.duration = 2.0f;
    fillColorAnimation.toValue = (id)((UIColor*)colorsArray[(i+index)%c]).CGColor;
    fillColorAnimation.repeatCount = 0;
    fillColorAnimation.autoreverses = FALSE;

    [l addAnimation:fillColorAnimation forKey:@"fillColor"];

}

[CATransaction setCompletionBlock:^
{
    if (currEffect != LpyEffect_MultiBall) return;

    NSUInteger c = [colorsArray count];
    int r = (index+1)%c;
    [self simMultiBallEffect:r]; // recursive call, new index
}];

[CATransaction commit];

1 个答案:

答案 0 :(得分:2)

+[CATransaction setCompletionBlock:]的文档说:

  

在此事务组随后添加的所有动画完成(或已被删除)后,保证在主线程上调用的完成块对象。如果在当前事务组之前没有添加动画,则已提交(或完成块设置为不同的值),将立即调用该块。

在添加完所有动画后,您需要设置完成功能块。您需要在添加任何动画之前进行设置。