2009-07-19 7 views
9

私はこれでビューを回転させています:コアアニメーションで特定の方向(時計回り)の回転を強制するにはどうすればよいですか?

CGAffineTransform rotatedTransform = CGAffineTransformRotate(CGAffineTransformIdentity, rotationValue); 

私は約320度の周りに回転するオブジェクトを持っています。コアアニメーションは賢明で、必要に応じて回転させるだけで、-40度で回転させることができます。そのため、オブジェクトはより短い移動量で他の方向に回転します。

時計回りに回転させたいのですが。小さなステップでアニメーションを変えることでそれをやらなければならないのでしょうか、それとももっとエレガントな方法がありますか?

答えて

18

次のスニペットは、キーフレームアニメーションを使用してというビューを回転します。アニメーションは、最初のフレーム、2番目のフレーム、最後のフレームのそれぞれ0º、180º、360ºにビューを回転して、1秒間に3枚のフレームで構成されています。コードは次のとおりです。

CALayer* layer = someView.layer; 
CAKeyframeAnimation* animation; 
animation = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation.z"]; 

animation.duration = 1.0; 
animation.cumulative = YES; 
animation.repeatCount = 1; 
animation.removedOnCompletion = NO; 
animation.fillMode = kCAFillModeForwards; 

animation.values = [NSArray arrayWithObjects: 
    [NSNumber numberWithFloat:0.0 * M_PI], 
    [NSNumber numberWithFloat:0.5 * M_PI], 
    [NSNumber numberWithFloat:1.0 * M_PI], nil]; 

animation.keyTimes = [NSArray arrayWithObjects: 
    [NSNumber numberWithFloat:0.0], 
    [NSNumber numberWithFloat:0.5], 
    [NSNumber numberWithFloat:1.0], nil]; 

animation.timingFunctions = [NSArray arrayWithObjects: 
    [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear], 
    [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear], nil]; 

[layer addAnimation:animation forKey:@"transform.rotation.z"]; 

あなたは反時計回りにアニメーション後にしている場合は、あなたが負の値を使用する必要があります。もう少し基本的なアニメーションを使用するには、CABasicAnimationを使用できます。

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

animation.fromValue = [NSNumber numberWithFloat:0.0 * M_PI]; 
animation.toValue = [NSNumber numberWithFloat:1.0 * M_PI]; 

animation.duration = 1.0; 
animation.cumulative = YES; 
animation.repeatCount = 1; 
animation.removedOnCompletion = NO; 
animation.fillMode = kCAFillModeForwards; 

[layer addAnimation:rotationAnimation forKey:@"transform.rotation.z"]; 
+0

特別なものを含める必要がありますか? Xcodeは、kCAMediaTimingFunctionLinearのようなすべてのkCAについて不平を言っています。彼らは不明です。あなたは何かがされていないとの問題があるときはいつでも、LD 1つの終了ステータス – Thanks

+0

".objc_class_name_CAKeyframeAnimation"、記号(複数可) collect2はが見つかりませんそれがどこに定義されているかを見るために、ドキュメント内でそれを検索する必要があります。この場合、これらの定数はQuartzCoreフレームワークの一部であるCAMediaTiming&CAMediaTimingFunctionで定義されます。 QuartzCore.frameworkを追加していない場合は、おそらくそれが問題です。 – Thanks

+2

が返されました: リテラル・ポインタ@__にObjC @__ TestClass.o LDでCAKeyframeAnimation @ cls_refs:から参照 –

1

コアアニメーションにその方向を向ける必要があるというヒントを与えるには、別の「キーフレーム」を与えなければならないと思います。

イージングをオフにしてください(少なくとも中間ステップの終了/開始)。そうしないとアニメーションが滑らかに見えません。

関連する問題