web-dev-qa-db-ja.com

CGAffineTransformMakeRotationを使用してビューを360度以上回転させることはできますか?

私はiPhoneアプリを書いていますが、外側に渦巻かせたい画像があります。

現在、私のコードは次のようになっています(beginAnimations/commitAnimationsブロックでラップされています):

scale = CGAffineTransformScale(CGAffineTransformIdentity, 5.0f, 5.0f);
swirl = CGAffineTransformRotate(scale, M_PI);
[player setTransform:swirl];    
[player setAlpha:0.0f];

しかし、回転角度をたとえば4 * M_PIに変更しようとすると、まったく回転しないことがわかりました。 CGAffineTransformRotateを使用して720°回転させることは可能ですか、それとも別のテクノロジーに切り替える必要がありますか?

別のテクノロジーに切り替える必要がある場合は、別のスレッド(またはタイマー)を使用して自分でアニメーションを作成することをお勧めしますか、それともOpenGLの方が適していますか?

ありがとう、
ブレイク。

28
bwinton

ビューを完全な回転よりも小さいか、完全な回転の倍数であるかに関係なく、回転を分割することなく、ビューをラジアン数だけ回転させることができます。例として、次のコードは、指定された秒数の間、1秒に1回ビューを回転させます。特定の回転数またはラジアン数でビューを回転させるように簡単に変更できます。

- (void) runSpinAnimationWithDuration:(CGFloat) duration;
{
    CABasicAnimation* rotationAnimation;
    rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
    rotationAnimation.toValue = [NSNumber numberWithFloat: M_PI * 2.0 /* full rotation*/ * rotations * duration ];
    rotationAnimation.duration = duration;
    rotationAnimation.cumulative = YES;
    rotationAnimation.repeatCount = 1.0; 
    rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];

    [myView.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"];
}
65
mahboudz

タイトルへの回答:はい、CGAffineTransformは360度以上回転できます。
質問への回答:はい。ただし、アニメーション化するものがないため、アニメーション化することはできません。

アフィン変換は行列です 、および回転行列には正弦数と余弦数が含まれていることを忘れないでください事前計算済み。それはあなたが言ったかのようです:

_CGFloat angle = 4.0 * M_PI;
NSAffineTransformStruct matrix = {
    .m11 = cos(angle),
    .m12 = sin(angle),
    .m21 = -sin(angle),
    .m22 = cos(angle),
    .tx = 0.0,
    .ty = 0.0
};
NSAffineTransform *transform = [NSAffineTransform transform];
[transform setTransformStruct:matrix];
_

それでは、cossinのサンプル値を確認しましょう。

  • cos(0π) = 1
  • sin(0π) = 0
  • cos(2π) = 1
  • sin(2π) = 0
  • cos(4π) = 1
  • sin(4π) = 0

行列には角度が含まれておらず、余弦と正弦のみが含まれていることを忘れないでください。そして、それらの値は円の倍数から別の倍数に変化しません。したがって、アニメートするものは何もありません。

(Calculator.appはcos(xπ)とsin(xπ)に対して間違った結果を与えることに注意してください。Grapher、 calc 、または Google を試してください。)

アニメーションを円の一部に分割する必要があります。ブラッドラーソンが提案した半円はうまくいくでしょう。

5
Peter Hosey

可能ですが、アニメーションを半円回転に分割する必要があります。ビューの下のレイヤーに適用されるCABasicAnimationを繰り返し使用して、 この質問 に応答してこの例を示します。私がそこで提案しているように、CAKeyframeAnimationの一部としてこれらの半回転を行うことは、アニメーションがよりスムーズになるため(私の例では半回転の間にわずかな問題があります)、おそらくこれを構造化するためのより良い方法です。開始時と終了時の素晴らしい加速/減速。

5
Brad Larson