2009-05-18 5 views
7

Je demande une transformation de rotation animation dans un bloc d'animation avec cette transformation:Y a-t-il un moyen de comprendre, combien de degrés une vue est actuellement tournée pendant une animation?

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

L'animation commence, et les coups de pied de l'utilisateur dans un autre événement qui devrait pousser la rotation vers une nouvelle cible. Pour calculer un comportement d'apparence réaliste, j'ai besoin de savoir quels sont les degrés actuels de la rotation, de sorte que les degrés de rotation suivants puissent être additionnés de manière appropriée.

+1

La deuxième réponse (par Tess Lowe) répond à cette question. Vous devriez le marquer comme accepté. – MikeyWard

Répondre

4

Vous pouvez récupérer l'état actuel d'un calque d'animation en saisissant sa couche de présentation. En supposant que vous avez pas appliqué d'autres transformations à la couche, on peut extraire l'angle actuel de la couche en rotation à l'aide du code comme les suivants:

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; 

Dans une transformation par ailleurs non modifié, les valeurs m11 et m12 sont des coordonnées qui Allongez-vous sur le cercle de l'unité, de sorte que vous pouvez utiliser la trigonométrie pour déterminer l'angle qu'ils décrivent.

EDIT (18/05/2009): Ajout d'un transtypage à CALayer pour surmonter les avertissements du compilateur et correction de la dénomination de la transformation dans les opérations de trigonométrie.

+0

La première ligne ne fonctionne pas. Le compilateur arrête la compilation. "Invalid initializer" et "méthodes multiples trouvées nommées -transform". Ouvert une autre question pour savoir comment y parvenir. D'autres sur le net (searchengine) semblent avoir les mêmes problèmes avec l'obtention des valeurs de la couche de présentation. – Thanks

+0

J'ai oublié d'ajouter un métamodèle à CALayer pour surmonter les avertissements du compilateur. En outre, j'ai corrigé les références à rotationTransform plus tard dans le calcul. J'ai testé cela et cela fonctionne pour une vue en rotation. –

+0

J'ai mis en place une méthode d'action qui s'appelle quand j'appuie sur un bouton. Ensuite, j'allume l'animation avec une durée de 10 secondes et une rotation de 180 °. La vue tourne lentement. Comme il tourne, je continue à cliquer sur le bouton. La méthode action exécute le code pour obtenir l'angle, mais l'angle est 0.0 tant que l'animation est en cours. Quand il a fini, et je demande à nouveau l'angle, je comprends: 180.0 ... pour une raison qui ne fonctionne pas pendant l'animation. Juste quand c'est fait. – Thanks

27

C'est une vieille question, mais je suis tombé sur cette réponse tout en essayant de trouver l'angle de rotation actuel au cours d'une animation image clé: -

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

semble fonctionner pour moi. Aussi, gentil et concis.

+2

Parfait. Succinct. Cela devrait être accepté comme réponse à la question. – MikeyWard

0

Vous pouvez également le calculer en utilisant des matrices et de la trigonométrie. Reportez-vous à ma réponse à cette question

0

Essayez ceci:

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)); 
Questions connexes