2013-02-01 7 views
6

私はパスの周りにアニメーションをつけているボールイメージを持っています。アニメーションは永遠に繰り返すように設定されていますが、繰り返しの間に遅延があるのはなぜですか?CAKeyFrameAnimationは繰り返しの前に遅れます

CGPathRef aPath; 
aPath = CGPathCreateWithEllipseInRect(CGRectMake(0, 0, SIZE, SIZE), NULL); 

[CATransaction begin]; 

arcAnimation = [CAKeyframeAnimation animationWithKeyPath: @"position"]; 
[arcAnimation setBeginTime:CACurrentMediaTime()]; 
[arcAnimation setDuration: 1.5]; 
[arcAnimation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]]; 
[arcAnimation setAutoreverses: NO]; 
[arcAnimation setRepeatCount:HUGE_VALF]; 
arcAnimation.removedOnCompletion = NO; 
arcAnimation.fillMode = kCAFillModeRemoved; 
[arcAnimation setPath: aPath]; 
[ball.layer addAnimation: arcAnimation forKey: @"position"]; 
[CATransaction commit]; 
CFRelease(aPath); 

答えて

9

これを試してみてください:

[animation setCalculationMode:kCAAnimationPaced] 
+0

はい、これは魅力のように機能します!ありがとう! –

+0

これを理解しようと時間を費やした。なぜそれがデフォルトにならないのだろうか? – cph2117

0

あなたはkCAFillModeForwardsまたはいくつかの他の値とのkCAFillModeRemovedを交換する必要があります。

は、ここに私のコードです。ドキュメントon whyを読んでください。さらに

置き換えます

[arcAnimation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]] 

を(あなたのテストの結果に応じて)では:

[arcAnimation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]] 

または

[arcAnimation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]] 
+0

Niravが、私は間違いなく中またはイーズアウトする必要はありません。アニメーションをスピードアップやスローダウンをせずにサークルから一定の速度で実行したい。私はすべての異なる塗りつぶしモードを試しましたが、アニメーションに顕著な影響はありません。アニメーションはまだ終了してからもう一度やり直してからもう一度やり直してください。 –

+0

次に、このことを作成しているのはsetBeginTime呼び出しだと思います。あなたはそれに電話をかけるので、開始するはずの2番目のものを評価するのに時間がかかります。削除してください。 –

+0

削除しました。それでもまったく同じように動作します。 –

1

を、私は実際に知りません答えは、あなたはやっているここには不必要なものがたくさんあり、私の提案はあなたがそれを取り除くことから始めるということです。 CATransactionブロック(beginおよびcommit)の必要はありません。 setBeginTime:の必要はありません。グループ化されたアニメーションではないので、removedOnCompletionfillModeを設定する必要はありません。アニメーションをレイヤーに追加して元に戻してください。それはすぐに始まり、永遠に繰り返され、あなたのコードはよりシンプルで良くなります。

関連する問題