2010-04-17 8 views
2

J'ai ce point de vue et je fais une transformation de rotation à l'aide de quelque chose commeComment animer la rotation et la mise à l'échelle simultanées d'une vue?

myView.transform = CGAffineTransformMakeRotation(degreesToRadian(90)); 
//The view was originally at 0 degrees. 

à un autre point de mon code, je voudrais à l'échelle de la vue animant, donc je ne

[UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationDuration:1.0]; 
myViews.transform = CGAffineTransformMakeScale(2.0f, 2.0f); 
[UIView commitAnimations]; 

mais quand je fais cela, l'animation est effectuée comme la vue est à 0 degrés, en ignorant la transformation précédente. Il suppose simplement que la vue est encore à zéro degré, donc, cette animation met à l'échelle la vue et la ramène à 0 degrés (!!!! ?????)

Est-ce un bug ou est-ce que quelque chose me manque? ? merci.

Répondre

3

Après avoir discuté avec KennyTM, je suis arrivé au meilleur des solutions pour avoir les deux transformations absolues ...

sur la méthode de zoom, je fais:

// notice that both transformations are absolute 
CGAffineTransform rotation = CGAffineTransformMakeRotation(degreesToRadian(viewAngle)); 
CGAffineTransform zoom = CGAffineTransformMakeScale(zoomFactor, zoomFactor); 
myView.transform = CGAffineTransformConcat(rotation, zoom); 

Je stocke l'angle de vue lorsque je fais pivoter la vue.

2

Parce que l'affectation .transform n'implique pas que la nouvelle sera concaténée à l'ancienne. Dans votre nouvelle transformation, vous spécifiez uniquement une mise à l'échelle de 200%, mais pas de rotation. La vue revient donc à 0 °.

Essayez ceci:

myViews.transform = CGAffineTransformScale(myViews.transform, 2.0f, 2.0f); 
+0

Merci, mais cela résout le problème de rotation, mais crée le problème d'échelle. Le problème est le suivant: j'ai 4 facteurs de zoom que j'utilise pour cette vue, quelque chose comme 0.66, 1.0, 1.5 et 2.0. Ce sont des valeurs absolues. Si j'utilise votre solution, il sera impossible de revenir à chaque facteur de zoom .... – SpaceDog

+0

@Mike: Pourquoi ne pas utiliser un ivar indépendant pour stocker le facteur de zoom? – kennytm

+0

Ce que je veux dire est ceci: supposons que le facteur de zoom est à 1. alors j'utilise votre solution et passe à 0,66. Maintenant, je veux aller à 2. En utilisant l'échelle absolue, je viens de mettre le zoomFactor comme 2, mais maintenant le facteur de zoom devra être de 3,03. Pour revenir à 0,66 maintenant, je vais devoir faire 0,21. Après des millions de transformations, je ne sais pas quel est le facteur de zoom maintenant. Je vais devoir garder un historique de toutes les transformations appliquées pour connaître le facteur de zoom actuel, juste en regardant l'ivar ... il n'y a aucun moyen d'appliquer la transformation à une vue et de la rendre permanente? Je veux dire, pour mettre à jour la matrice de transformation? – SpaceDog