CAShapeLayer 动画的完成块

Posted

技术标签:

【中文标题】CAShapeLayer 动画的完成块【英文标题】:Completion block for CAShapeLayer animations 【发布时间】:2014-09-09 21:38:25 【问题描述】:

我有一个包含 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】:

+[CATransaction setCompletionBlock:] 的文档说:

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

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

【讨论】:

以上是关于CAShapeLayer 动画的完成块的主要内容,如果未能解决你的问题,请参考以下文章

CAShapeLayer 动画无需更新路径

CAShapeLayer 路径动画

当任何其他动画发生时,CAShapeLayer 会重绘自己吗?

UIView 动画完成块在其他动画开始时触发

动画中断时未调用 UIView 动画完成块

完成块(隐式动画)