1

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;希望の思考ではないかもしれません。それがこのように開始する必要が終わりと始まりであった場所、それがとどまるようにするには、アニメーションにフラグを設定することができます

+1

アニメーションによってレイヤーの状態が変更されないため、レイヤーのstrokeEndをゼロに設定することで、スプリングバックエフェクトを省略できます。 – clemens

答えて

1

あなたはあなたのコードを簡素化し、スプリング効果を省略することができます

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

をトランザクションがあなたのための暗黙のアニメーションオブジェクトを作成して追加します。

0

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

チェックもこの答え: What exactly does removedOnCompletion = NO do?

+1

レイヤーにアニメーションを保存しないでください。後でアニメーションを削除または置換すると_unexpected_エフェクトが発生します。 'addAnimation'の前の' layer.strokeEnd = 0.0'は同じ効果を持ちます。 – clemens

+0

アニメーションを保持するもう一つの欠点は、レイヤーが_visible state_を反映していないことです。 'strokeEnd'では常に1.0を返しますが、0.0の値を表示します。 – clemens

関連する問題