CAShapeLayerをアニメーション化する場合、レイヤのパスを常に更新する必要がありますか、またはCABasicAnimationだけに依存する方法はありますか?CAShapeLayerパスを更新する必要がないアニメーション
以下の例では、4つの円のパスを設定して描画します。 次にアニメーションを消して消えてしまいたいです。ただし、アニメーションが完了した後、元のパスに戻ります。
[CATransaction setCompletionBlock:^{
//set the new path
layer.path = [UIBezierPath bezierPathWithArcCenter:cicleCenter radius:radius startAngle:degreesToRadians(circleStart) endAngle:degreesToRadians(arcEnd) clockwise:true].CGPath;
}];
しかし、パスを更新し、代わりに専用のアニメーションレイヤに頼ら保つ回避を好むだろう:
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];
}
私は新しいパスを設定し、これを追加することができることを理解しています。これは可能ですか?
次のようなものです。layer.path = animation.pathまたはanimation.updatesOriginalPath = true;希望の思考ではないかもしれません。それがこのように開始する必要が終わりと始まりであった場所、それがとどまるようにするには、アニメーションにフラグを設定することができます
アニメーションによってレイヤーの状態が変更されないため、レイヤーのstrokeEndをゼロに設定することで、スプリングバックエフェクトを省略できます。 – clemens