2012-05-04 14 views
10
[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の方向を逆転させたが、明らかにされていないだろうと思ったでしょうか?

答えて

12

角度は同じです。フルサークルに行くには2 * Piが必要なので、半分の円はPiです。あなたが-Piを取るなら、それは同じ点で終わるでしょう。

EDIT:時計回りに回す必要がある場合は、-Piを少しオフにすることができます。 -M_PIの代わりに-3.141593を使用します。

+0

私は同意しますが、私は時計回りに180度回転する必要があります。これを有効にする最良の方法は何ですか?乾杯。 – geminiCoder

+1

これは、最短の方向に回転します。精度が大きな問題ではない場合は、180度をわずかに下回るか上回るように回転できます。それは迅速かつ汚れた修正ですが、おそらく動作します。 – RadicalRaid

+0

あなたの編集を見ました。それはうまくいくが、ちょっと不完全なように思える。 – geminiCoder

2

「iOSでは、正の値は反時計回りの回転を指定し、負の値は時計回りの回転を指定します。」これをやろうとしましたか:

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

これまで私は時計回りをすべて過去にやっていました。

+0

はいこれが問題です。上のコードでわかるように、これは動作しません。なぜ分からないの? – geminiCoder

3

Core animatinonでの私の経験は、Appleの引用に同意しません。私が見つけたのは、重要なのは最終的な角度値だけです。正のπ回転と負のπ回転は同じ変換行列になります。したがって、システムは、関係なく、常に逆時計回りになります。

特定の方向、つまり360度の回転で回転を行うために行ったことは、kcaFillModeForwardsに設定された塗りつぶしモードでtransform.rotation.zのような型を使用して明示的なCABasicAnimationを作成することです。 toValueのみを提供します。これにより、アニメーションは以前の値から開始されます。次に、希望の合計ローテーションの偶数に相当するローテーションを設定し、繰り返しカウントを与えます。

たとえば、次のコードでは、5分の4回転または450度回転するアニメーションが作成されます。あなたは時計回りに180度をやってみたかった場合は、反時計回りに2.の繰り返し回数とPI/2の回転ができた、ちょうどこのに走った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]; 
7

の繰り返し回数を-pi/2を使用します@ラジカルレイドの解決策はうまく動作しますが、私は、回転前に開始角度を調整し、目的の終了ポイントよりも小さい角度に回転させることを好みます。また、アニメーションブロックを使用してCALayerのトランスフォームをアニメートすることもできます。

マイコード:

// iOS will rotate the shortest distance to the end angle, 
// using counter-clockwise if equal. 
// Force the rotation to open clockwise and close counter-clockwise by bumping 
// the initial angle 
CGFloat startRadians, endRadians; 
if (isOpening) { 
    startRadians = 0.01f; 
    endRadians = M_PI; 

} 
else { 
    startRadians = M_PI - 0.01f; 
    endRadians = 0.0f; 
} 

self.myImageView.layer.affineTransform = CGAffineTransformMakeRotation(startRadians); 

[UIView animateWithDuration:0.3f 
       animations:^{ 
        self.myImageView.layer.affineTransform = CGAffineTransformMakeRotation(endRadians); 
       }]; 
0

はダンカンと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 

} 
1

EDIT:代わりに-M_PI使用-3 * M_PI、反時計回り

や削除のために ' - ' 記号を逆の方向のため。

関連する問題