1

私はCAKeyframeAnimation回転アニメーションを行うために使用しています。ボタンを使用して、レイヤーでアニメーションをトリガーしています。

前のアニメーション停止ラジアンから次の回転アニメーションを開始したい。で設定fillmodeしましkCAFillModeForwardsたが、停止ラジアンは元に戻りませんが、次に回転アニメーションを開始すると、アニメーションは常に前の停止状態からではなく元から開始されます。

それに対する解決策はありますか?

4

2 に答える 2

2

質問の意味がよくわかりません。回転後も角度を維持し、その 2 回目の回転は別のアニメーションになりますか? それとも無期限に回転させますか?

両方狙っていきます。

角度を保つ

一度回転させてから、現在の角度に保ち、後でもう一度回転させたいですか?

さて、「モデル層」と「プレゼンテーション層」がどのように存在するかを理解する必要があります。プレゼンテーション レイヤーが ( removedOnCompletion) になると、モデル レイヤーに戻ります。そのため、「モデル レイヤー」を変更して最終結果を得ることができます。

CALayer *layer = <#self.myview.layer#>;

CGFloat angle = M_PI_4;

// Get the new transform
CATransform3D transform = CATransform3DRotate(layer.transform, angle, 0, 0, 1);

// Apply the animation to the "presentation layer"
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform"];

animation.fromValue = [NSValue valueWithCATransform3D:layer.transform];
animation.toValue   = [NSValue valueWithCATransform3D:transform];
animation.duration  = 1.0;

animation.removedOnCompletion = YES;
animation.fillMode = kCAFillModeForwards;

[layer addAnimation:animation forKey:@"spinme"];

// Apply the transform to the "model layer"
layer.transform = transform;

最後に を設定することに注意してくださいlayer.transform。これにより、アニメーションが終了したときに、モデル レイヤーがプレゼンテーション レイヤーで最新の状態になります。

無期限に回転

注意すべき 2 つの重要なプロパティは次のとおりです。

animation.cumulative = YES;
animation.repeatCount = HUGE_VALF;
  • 累積は、前の変換からの結果を合計して、それを累積します。元の状態には戻りません。
  • 繰り返し回数は、スピンする回数を決定します。HUGE_VALF は、基本的に無限と言う良い方法です。

一方、cumulativeアニメーションが単独で完全なサイクルになる場合は、使用を避けることができます。たとえば、次のアニメーション:

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];

animation.fromValue = @(0);
animation.toValue   = @(2*M_PI);
animation.duration  = 1.0;

animation.cumulative = NO;
animation.repeatCount = HUGE_VALF;
animation.removedOnCompletion = YES;
animation.fillMode = kCAFillModeForwards;

完全な 360 度 (2*pi) になるため、累積フラグは必要ありませんが、繰り返し回数は依然として関連しています。アニメーションは、理論上、他の誰かが削除した場合にのみ終了することはないため、完了時に削除されるのはほとんどオプションです。

どの方法を選択するかは、正確に何を達成しようとしているかによって異なります。

于 2013-07-30T04:41:12.730 に答える
0

次の回転アニメーションを停止前の状態から開始したい場合、重要な点は、アニメーション前の終了時に、プレゼンテーション レイヤーの現在の値に従ってモデル レイヤーを更新する必要があることです。

于 2014-08-06T07:28:14.790 に答える