私はCAKeyframeAnimation
回転アニメーションを行うために使用しています。ボタンを使用して、レイヤーでアニメーションをトリガーしています。
前のアニメーション停止ラジアンから次の回転アニメーションを開始したい。で設定fillmode
しましkCAFillModeForwards
たが、停止ラジアンは元に戻りませんが、次に回転アニメーションを開始すると、アニメーションは常に前の停止状態からではなく元から開始されます。
それに対する解決策はありますか?
質問の意味がよくわかりません。回転後も角度を維持し、その 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;
一方、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) になるため、累積フラグは必要ありませんが、繰り返し回数は依然として関連しています。アニメーションは、理論上、他の誰かが削除した場合にのみ終了することはないため、完了時に削除されるのはほとんどオプションです。
どの方法を選択するかは、正確に何を達成しようとしているかによって異なります。
次の回転アニメーションを停止前の状態から開始したい場合、重要な点は、アニメーション前の終了時に、プレゼンテーション レイヤーの現在の値に従ってモデル レイヤーを更新する必要があることです。