2010-02-02 4 views
1

J'essaye de faire ceci: Il y a une vue qui a déjà été tournée à une certaine valeur, disons 15 degrés.Comment continuer à faire pivoter une vue avec un CAKeyFrameAnimation?

Imaginez une vue pivotée de 15 degrés.

Ensuite, je sais seulement que je veux ce point de vue de tourner à partir de son rotation actuelle à 40 degrés. Imaginez comment cette vue pivote maintenant de 15 à 40 degrés.

Pour la pratique, je veux le faire avec CAKeyFrameAnimation. Mais la chose est, tout ce que je peux faire là-bas est de spécifier avec précision où d'où. Il n'y a pas d'option "ramasser l'état actuel" comme les animations UIView ont, non? Comment pourrais-je y aller?

De plus, je veux toujours spécifier 3 images-clés pour cette rotation, quelle que soit la quantité de rotation nécessaire.

Imaginez ce point de vue tourne de 15 à 40 degrés, en utilisant 3 images clés pour le faire

Mais un autre gros problème: Il peut arriver, qu'une autre animation doit lancer avec une cible différente. disons qu'une vue est actuellement en rotation de 20 à 100 degrés, et juste quelque part entre l'animation une nouvelle animation est lancée et veut que cette vue passe à 15 degrés. Avec les animations UIView, c'est simple. Comment faire cela avec CAKeyFrameAnimation?

Fondamentalement, je veux de se comporter comme des animations UIView qui ramassent l'état actuel;)

CALayer* theLayer = rotatedView.layer; 

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

animation.duration = 2; 
animation.repeatCount = 1; 
animation.removedOnCompletion = NO; 
animation.fillMode = kCAFillModeForwards; 

animation.values = [NSArray arrayWithObjects: 
        [NSNumber numberWithFloat:(10.0/180.0) * M_PI], 
        [NSNumber numberWithFloat:(20.0/180.0) * M_PI], 
        [NSNumber numberWithFloat:(30.0/180.0) * M_PI], nil]; 

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

Répondre

0

Vous pouvez obtenir l'angle de départ pour une utilisation dans la configuration de votre animation soit en utilisant le code comme ce que je fournis dans this answer:

CATransform3D rotationTransform = [theLayer 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; 

ou en utilisant la méthode keypath d'aide simple suggested here:

float currentAngle = ([[theLayer valueForKeyPath:@"transform.rotation.z"] floatValue] * 180.0f/M_PI); 

Si vous ajoutez cette animation à une animation déjà en cours, vous devrez interroger directement l'angle actuel de presentationLayer de theLayer, au lieu de theLayer. PresentationLayer pour une CALayer reflète l'état actuel d'une animation mid-layer.

Questions connexes