0

速度計のように機能するアニメーションをまとめようとしています。

最初のアニメーションは針を取得します

CFTimeInterval localMediaTime = [needle convertTime:CACurrentMediaTime() fromLayer:nil];

CABasicAnimation *needAni = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
needAni.duration = 0.5f;
needAni.fromValue = [NSNumber numberWithFloat:0.0];
needAni.toValue = [NSNumber numberWithFloat:(rotVal * M_PI / 180.0)];
needAni.timingFunction = [CAMediaTimingFunction functionWithControlPoints:0.195: 0.600: 0.790: 0.405];
needAni.fillMode = kCAFillModeBackwards;

[needle.layer addAnimation:needAni forKey:nil];

その後、フルスピードになったときに針を少し前後に跳ねさせたいと思います。このアニメーションはまさにそれを行います:

CABasicAnimation *needAni2 = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
needAni2.duration = 0.1f;
needAni2.fromValue = [NSNumber numberWithFloat:(rotVal * M_PI / 180.0)];
needAni2.toValue = [NSNumber numberWithFloat:((rotVal+5) * M_PI / 180.0)];
needAni2.fillMode = kCAFillModeBackwards;
needAni2.autoreverses = YES;
needAni2.repeatCount = HUGE_VAL;
needAni2.beginTime = localMediaTime + 0.5f;

[needle.layer addAnimation:needAni2 forKey:nil];

これをまとめると、2 番目のアニメーションだけが再生されます。

これらの 2 つのアニメーションをグループに入れるのに疲れましたが、2 番目のアニメーションを繰り返すだけではないようで、プロセス全体が繰り返されます。グループ期間を HUGE_VAL に設定すると、パフォーマンスに問題がありますか、それとももっと良い方法がありますか?

ありがとう

4

1 に答える 1

0

これはCAGroupAnimationの意図された使用法であるように思われるので、あなたの方法に固執することができると思います。グループに適切な期間を設定していることを確認してください。グループの継続時間を意図したアニメーションよりも短くすると、アニメーションが短くなります。継続時間をアニメーションよりも長くすると、その継続時間が終了するまでアニメーション オブジェクトがメモリに残る可能性があります。

別のオプションは、デリゲート メソッド -animationDidStop:finished: を実装し、最初のアニメーションによって呼び出されたときに 2 番目のアニメーションを追加することです。

CAAnimation リファレンス: https://developer.apple.com/library/ios/#documentation/GraphicsImaging/Reference/CAAnimation_class/Introduction/Introduction.html#//apple_ref/occ/cl/CAAnimation

于 2013-04-03T22:35:18.157 に答える