2009-05-18 3 views
7

私は回転がこの変換とアニメーションブロックにアニメーションを変換を適用しています:アニメーションが始まりますアニメーション中にビューが現在何回転しているか把握する方法はありますか?

CATransform3D rotatedTransform = self.layer.transform; 
rotatedTransform = CATransform3DRotate(rotatedTransform, 90 * M_PI/180.0, 0.0f, 0.0f, 1.0f); 
self.layer.transform = rotatedTransform; 

、および新たなターゲットに向けて回転をプッシュする必要があります別のイベントでユーザーキック。現実的な見た目の動作を計算するには、回転の現在の度合いを知る必要があるため、次の回転度を適切に追加することができます。

+1

(テス・ロウによる)は、第2の答えは、この質問に答えます。それをAcceptedとしてマークする必要があります。 – MikeyWard

答えて

4

アニメーションレイヤの現在の状態を取得するには、そのpresentationLayerを取得します。レイヤーに他の変換を適用していないと仮定すると、次のようなコードを使用して、回転層の現在の角度を抽出することができる:特に非修飾で

CATransform3D rotationTransform = [(CALayer *)[self.layer presentationLayer] transform]; 
float angle; 
if (rotationTransform.m11 < 0.0f) 
    angle = 180.0f - (asin(rotationTransform.m12) * 180.0f/M_PI); 
else 
    angle = asin(rotationTransform.m12) * 180.0f/M_PI; 

変換、M11及びM12の値は、その座標であります単位円上にあるので、三角法を使用して、その角度を決定することができます。

EDIT(5/18/2009):コンパイラの警告を克服するためにCALayerに型キャストを追加し、三角関数の操作で変換の名前を固定しました。

+0

最初の行は機能しません。コンパイラはコンパイルを停止します。 "初期化子が無効です"と "-transformという名前のメソッドが見つかりました"。その権利を得るための別の質問を開きました。他のネット(searchengine)は、プレゼンテーションレイヤーから値を取得する際に同じ問題があるようです。 – Thanks

+0

コンパイラの警告を克服するためにCALayerに型キャストを追加するのを忘れました。また、後で計算でrotationTransformへの参照を修正しました。私はこれをテストし、それは回転するビューのために働く。 –

+0

ボタンをタップしたときに呼び出されるアクションメソッドを設定しました。その後、10秒間の回転と180度の回転でアニメーションを発火させます。ビューがゆっくりと回転します。回転するにつれて、私はボタンをキリクインしています。アクションメソッドはコードを実行して角度を取得しますが、アニメーションが実行されている間は角度は0.0です。それが終了し、角度をもう一度尋ねると、私はそれを取得します:180.0 ...何らかの理由でアニメーション中に動作しません。それが終わったらすぐに。 – Thanks

27

これは、古い質問ですが、キーフレームアニメーションの間、現在の回転角度を見つけようとしている間、私はこの答えに出くわした: -

CALayer* layer = [self.layer presentationLayer]; 
float currentAngle = [[layer valueForKeyPath:@"transform.rotation.z"] floatValue]; 

は私のために動作するようです。また、いいと簡潔です。

+2

パーフェクト。簡潔です。これは質問の回答として受け入れられるべきです。 – MikeyWard

0

行列や三角法を使って計算することもできます。このquestion

0

のために私の答えを参照してくださいことは、これを試してみてください:

CGFloat setAngle = 75.0; 
CATransform3D t = CATransform3DIdentity; 
t.m34 = 0.004; 
t = CATransform3DRotate(t, -M_PI/180*setAngle, 0, 1, 0); 
self.testView.layer.transform = t; 

CGFloat getAngle = 0; 
if (t.m11 < 0.0f) { 
    getAngle = 180.0f - (asin(t.m13) * 180.0f/M_PI); 
} else { 
    getAngle = asin(t.m13) * 180.0f/M_PI; 
} 
NSLog(@"setAngle=%@ getAngle=%@", @(setAngle), @(getAngle)); 
関連する問題