无需更新路径的CAShapeLayer动画



当动画CAShapeLayer时,是否有必要不断更新层的路径,或者是否有一种方法仅依赖于CABasicAnimation ?

在下面的例子中,我设置了四个圆路径并绘制它们。然后我想让它们向下消失。动画完成后,它们会回到原来的路径。

    int radius =  halfWidth-30; //the radius is the distance out from the centre
    trackActive.path = [UIBezierPath bezierPathWithArcCenter:cicleCenter radius:radius startAngle:degreesToRadians(circleStart) endAngle:degreesToRadians(circleEnd) clockwise:true].CGPath;
    circleActive.path = [UIBezierPath bezierPathWithArcCenter:cicleCenter radius:radius startAngle:degreesToRadians(circleStart) endAngle:degreesToRadians(circleEnd) clockwise:true].CGPath;
    radius = halfWidth - 10;
    trackNew.path = [UIBezierPath bezierPathWithArcCenter:cicleCenter radius:radius startAngle:degreesToRadians(circleStart) endAngle:degreesToRadians(circleEnd) clockwise:true].CGPath;
    circleNew.path = [UIBezierPath bezierPathWithArcCenter:cicleCenter radius:radius startAngle:degreesToRadians(circleStart) endAngle:degreesToRadians(circleEnd) clockwise:true].CGPath;
    NSArray * layers = @[trackActive, circleActive, trackNew, circleNew];
    for (CAShapeLayer * layer in layers){
        [CATransaction begin];
        CABasicAnimation * animation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
        animation.duration = 1.0f;
        animation.removedOnCompletion = false;
        animation.fromValue = @(1.0);
        animation.toValue = @(0.0);
        animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
        [layer addAnimation:animation forKey:@"circleAnimation"];
        [CATransaction commit];
    }

我明白我可以添加这个来设置新的路径:

    [CATransaction setCompletionBlock:^{
        //set the new path
        layer.path = [UIBezierPath bezierPathWithArcCenter:cicleCenter radius:radius startAngle:degreesToRadians(circleStart) endAngle:degreesToRadians(arcEnd) clockwise:true].CGPath;
    }];

但是我宁愿避免不断更新路径,而只依赖动画层。这可能吗?

类似:layer。路径=动画。path或animation.updatesOriginalPath=true;可能是一厢情愿,不确定。

您可以简化代码并省略spring效果:

[CATransaction begin];
[CATransaction setAnimationDuration:1.0];
[CATransaction setAnimationTimingFunction: kCAMediaTimingFunctionEaseInEaseOut];
layer.strokeEnd = 0.0;
[CATransaction commit];

事务将为您创建并添加一个隐式动画对象。

你可以在动画中设置一个标志,让它停留在结束时的位置,从应该开始的地方开始,像这样:

[animation setRemovedOnCompletion:NO];
[animation setFillMode:kCAFillModeBoth];

也检查这个答案:究竟removedOnCompletion = NO做什么?

最新更新