7

で作成した回転アニメーションを使用していCABasicAnimationます。UIView2秒以上回転します。UIViewしかし、私は触れられたときにそれを止めることができる必要があります。アニメーションを削除すると、ビューはアニメーションが開始される前と同じ位置になります。

これが私のアニメーションコードです:

float duration = 2.0;
float rotationAngle = rotationDirection * ang * speed * duration;
//rotationAngle =  3*(2*M_PI);//(double)rotationAngle % (double)(2*M_PI) ;
CABasicAnimation* rotationAnimation;
rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
rotationAnimation.toValue = [NSNumber numberWithFloat: rotationAngle ];
rotationAnimation.duration = duration;
rotationAnimation.cumulative = YES;
rotationAnimation.removedOnCompletion = NO;
rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
rotationAnimation.fillMode = kCAFillModeForwards;
rotationAnimation.delegate = self;

[self.view.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"];

UIView触れたときに、その回転を正しい位置で停止するにはどうすればよいですか?タッチ部分の管理方法は知っていますが、アニメーションの現在の角度でビューを停止する方法がわかりません。

解決策: プレゼンテーション層の角度を取得し、アニメーションを削除し、ビューの変換を設定することで、問題を解決しました。コードは次のとおりです。

[self.view.layer removeAllAnimations];      
CALayer* presentLayer = self.view.layer.presentationLayer; 
float currentAngle = [(NSNumber *)[presentLayer valueForKeyPath:@"transform.rotation.z"] floatValue];
self.view.transform = CGAffineTransformMakeRotation(currentAngle);
4

2 に答える 2

18

良い質問!このためには、CoreAnimationアーキテクチャを知っておくと役に立ちます。

Core Animationレンダリングアーキテクチャについて説明しているCoreAnimationプログラミングガイドの図を確認すると、3つのツリーがあることがわかります。

モデルツリーがあります。ここで、実行したいことの値を設定します。次に、プレゼンテーションツリーがあります。ランタイムに関する限り、これがほとんど起こっていることです。次に、最後にレンダリングツリーです。それがユーザーに表示されるものです。

あなたの場合、プレゼンテーションツリーの値をクエリしたいとします。

簡単です。アニメーションを添付したビューの場合は、を取得し、layerそのためにlayer、の値をクエリしpresentationLayerます。例えば:

CATransform3D myTransform = [(CALayer*)[self.view.layer presentationLayer] transform];

フローの途中でアニメーションを「一時停止」する方法はありません。実行できるのは、値を照会して削除し、中断したところから再作成することだけです。

少し苦痛です!

私がこれについてもう少し詳しく説明している他の投稿のいくつかを見てください。

アプリがバックグラウンドから再開したときに中断したアニメーションを復元する

ビューのレイヤーにアニメーションを追加するとき、実際には基になるビューのプロパティを変更していないことも忘れないでください。では、どうなりますか?アニメーションが停止し、ビューが元の位置に表示されるという奇妙な効果が得られます。

CAAnimationここで、デリゲートを使用する必要があります。私がこれをカバーしているこの投稿への私の答えを見てください:

CABasicAnimationrotateが元の位置に戻ります

于 2012-06-19T10:24:31.120 に答える
5

回転をpresentationLayerの回転に設定してから、アニメーションをレイヤーから削除する必要があります。プレゼンテーション層については、アニメーション層のヒットテストに関する私のブログ投稿で読むことができます。

最終回転を設定するコードは次のようになります。

self.view.layer.transform = [(CALayer*)[self.view.layer presentationLayer] transform];
[self.view.layer removeAnimationForKey:@"rotationAnimation"];
于 2012-06-19T10:12:57.453 に答える