12
[CATransaction begin];
            [CATransaction setAnimationDuration:5];
            CGAffineTransform currentTransform = squareLayer.affineTransform;
            CGFloat angle = M_PI;

            squareLayer.affineTransform = CGAffineTransformRotate(currentTransform, angle);
            [CATransaction commit];

[CATransaction begin];
            [CATransaction setAnimationDuration:5];
            CGAffineTransform currentTransform = squareLayer.affineTransform;
            CGFloat angle = (M_PI * -1);

            squareLayer.affineTransform = CGAffineTransformRotate(currentTransform, angle);
            [CATransaction commit];

私は -1 が方向を逆にしたと思ったでしょうが、どうやらそうではありませんか?

4

8 に答える 8

15

角度は同じです。一周するには 2 * Pi が必要なので、半円は Pi です。-Pi を服用すると、同じ時点で終了します。

編集: 時計回りに回転させる必要がある場合は、-Pi から少しずらすことができます。-M_PI の代わりに、たとえば -3.141593 を使用します。

于 2012-05-04T09:11:26.543 に答える
5

コア アニメーションに関する私の経験は、その Apple の引用に同意しません。私が見つけたのは、重要なのは最終的な角度の値だけだということです。正の円周率と負の円周率の回転は同じ変換行列になるため、システムは関係なく反時計回りになります。

特定の方向への回転、または完全な 360 度の回転を行うために行ったことは、transform.rotation.z のようなタイプを使用して明示的な CABasicAnimation を作成し、塗りつぶしモードを kCAFillModeForwards に設定し、toValue のみを提供することです。 . これにより、アニメーションが前の値から開始されます。次に、希望するローテーション全体の偶数のローテーションを設定し、繰り返し回数を指定できます。

たとえば、次のコードは 450 度 5 回転するアニメーションを作成します。時計回りに 180 度回転させたい場合は、繰り返し回数 2 で pi/2 の回転が可能です。反時計回りの場合は、繰り返し回数 2 で -pi/2 を使用します。

  CABasicAnimation* rotate =  [CABasicAnimation animationWithKeyPath: 
    @"transform.rotation.z"];
  rotate.removedOnCompletion = FALSE;
  rotate.fillMode = kCAFillModeForwards;

  //Do a series of 5 quarter turns for a total of a 1.25 turns
  //(2PI is a full turn, so pi/2 is a quarter turn)
  [rotate setToValue: [NSNumber numberWithFloat: -M_PI / 2]];
  rotate.repeatCount = 5;

  rotate.duration = duration/rotate.repeatCount * 2 ;
  rotate.beginTime = start;
  rotate.cumulative = TRUE;
  rotate.timingFunction = [CAMediaTimingFunction 
    functionWithName:kCAMediaTimingFunctionLinear];
于 2012-05-05T20:52:50.517 に答える
4

編集: -M_PI の代わりに -3 * M_PI を反時計回りに使用します。

反対方向の「-」記号を削除します。

于 2016-07-06T06:16:41.953 に答える
2

これは、アップルのドキュメントからの引用です「iOSでは、正の値は反時計回りの回転を指定し、負の値は時計回りの回転を指定します。」これを試しましたか:

squareLayer.affineTransform = CGAffineTransformRotate(currentTransform, -M_PI);

それは、過去に時計回りの回転をすべて行うために使用したものです。

于 2012-05-04T09:20:56.567 に答える
2

この前の質問を見てください: UIImageView の CABasicAnimation に対して時計回り/反時計回りの回転を強制します。コードは少し異なりますが、機能します。

于 2012-05-04T09:17:00.637 に答える
0

Duncan と XJones に同意します。最終的な値だけが問題と思われるすべてです。その後、CA は最短パスを見つけます。

XJones のアイデアを使用します。これは私にとってはうまくいくようでした:

private let angleRadians = CGFloat(M_PI)
private let angleRadiansOffset = CGFloat(0.1 * M_PI/180.0)

let turnAngle = angleRadians - angleRadiansOffset;

//pre-rotate by an 'invisible amount', to force rotation in the same direction every time
primView.layer.transform = CATransform3DRotate(primView.layer.transform, angleRadiansOffset, 0.0, 1.0, 0.0)

UIView.animateKeyframesWithDuration(duration, delay: 0, options: [.BeginFromCurrentState], animations: { () -> Void in

    UIView.addKeyframeWithRelativeStartTime(0, relativeDuration: 0.8, animations: { () -> Void in

        //now we will complete the rotation to the correct end value
        primView.layer.transform = CATransform3DRotate(primView.layer.transform, turnAngle, 0.0, 1.0, 0.0)

    })

    //... other code ....

}) { (finished) -> Void in

}
于 2016-02-26T15:04:50.673 に答える