Puis-je déplacer l'origine lors d'une rotation de la transformer en Quartz 2D pour l'iPhone?
Désolé si c'est évident, ou couvertes d'ailleurs, mais j'ai cherché sur google toute la journée et n'ai pas trouvé de solution qui fonctionne.
Mon problème est le suivant: je suis en train de dessiner une image en plein écran UIView, pour des exemples de saké, on va dire que l'image est dans le coin en bas à droite de la UIView. J'aimerais faire une transformation de rotation(CGAffineTransformMakeRotation) au centre de l'image, cependant, par défaut, la commande de rotation tourne autour du centre de la UIView de soi. Comme un résultat, mon image se déplace autour de l'écran lorsque je tourne au lieu de rester en place et en rotation autour de son propre centre.
De ce que j'ai recueillis, j'ai besoin de traduire mon contexte, de sorte que l'origine(centre de la UIView) est au centre de mon image, de la faire Pivoter, puis de restaurer le contexte par traduction en arrière à l'original spot.
Ce qui suit est la chose la plus proche que j'ai eu à travailler, mais le problème est que, si l'image est en rotation, il se déplace vers le bas alors qu'il est en rotation. Je pense que cela est causé par l'animation de l'interpolation de la 1ère étape de la traduire et de la 3ème étape de traduire au lieu de juste de réaliser que le début et le point final sur l'traduit serait le même...
//Before this i'd make a call to a function that draws a path to a passed in context
CGAffineTransform inverseTranslation = CGAffineTransformMakeTranslation( transX, transY );
CGAffineTransform translation = CGAffineTransformMakeTranslation( -transX, -transY );
CGAffineTransform rot = CGAffineTransformMakeRotation( 3.14 );
CGAffineTransform final = CGAffineTransformConcat( CGAffineTransformConcat( inverseTranslation, rot ), translation );
//Then i apply the transformation animation like normal using self.transform = final etc etc
J'ai aussi essayé des trucs comme CGContextTranslateCTM et CGContextSaveGState/UIGraphicsPushContext, mais ceux-ci semblent avoir peu d'effet.
Je me bats avec cette pendant des jours et ma solution actuelle semble proche, mais je n'ai pas la moindre idée de comment se débarrasser de la traduction de l'interpolation. Quelqu'un aurait-il une solution ou une meilleure façon d'aller à ce sujet?
[mise à jour]
Pour le moment, je suis attiré mon image, centrée sur la UIview du centre et de définir ensuite la UIView.centre de bien à l'origine j'aimerais tourner et faire la commande rotation. Semble comme un peu un hack, mais jusqu'à ce que je peux obtenir le vrai traduit de travail, c'est mon seul choix.
Merci!
OriginalL'auteur Skyler | 2009-03-22
Vous devez vous connecter pour publier un commentaire.
duncanwilcox réponse est la bonne, mais il a quitté la partie où vous modifiez le point d'ancrage de la vue du calque à l'endroit où vous voulez tourner.
Cela est documenté ici: http://developer.apple.com/documentation/Cocoa/Conceptual/CoreAnimation_guide/Articles/Layers.html
OriginalL'auteur n8gray
C'est aussi une option: un simple changement de base 😉
où
(x,y)
est le centre de rotation que vous aimezOriginalL'auteur Abramodj
Rotation qui se passe autour de la anchorPoint de l'affichage de la couche. La valeur par défaut pour le anchorPoint est le centre (0.5, 0.5), de sorte que la rotation sans les traductions devraient suffire.
Fait un rapide test et cela fonctionne pour moi:
rapide commentaire édité pour montrer que vous devriez utiliser les maths.h constantes lorsque l'on travaille avec des valeurs pi. M_PI_4, M_PI_2, M_PI sont mieux et plus précis que toutes les erreurs d'arrondi 🙂
OriginalL'auteur duncanwilcox
Si vous ne veux pas d'une animation à se produire, mais il suffit de régler la nouvelle rotation, vous pouvez utiliser ceci:
La rotation doit en effet prendre place autour du centre de la UIView. Réglage de la animationDuration à zéro garantit pas l'interpolation doit arriver.
Être sûr que vous ne faites pas cela de 60 fois par seconde. Il est très tentant de créer du jeu, comme les animations avec ces outils. Ces animations ne sont pas exactement signifiait pour une image à l'autre en fonction, "beaucoup de sprites voler partout" de jeu.
Pour que - et j'ai été vers le bas de la route - la seule façon d'aller, est OpenGL.
Assurez-vous d'enregistrer le CGContext état avant de faire la CGContextTranslateCTM. Ensuite restaurer l'état. Il n'a pas (apparente) de l'effet, si vous venez de traduire la marque communautaire après le dessin dans votre contexte.
OriginalL'auteur Kriem