Puis-je déplacer l'origine lorsque vous faites une rotation transformée en Quartz 2D pour l'iPhone?

StackOverflow https://stackoverflow.com/questions/670562

Question

Désolé si cela est évident ou couvert ailleurs, mais je l'ai été googler toute la journée et n'a pas trouvé une solution qui fonctionnait vraiment.

Mon problème est le suivant: Je dessine actuellement une image dans un UIView plein écran, pour l'amour des exemples que nous allons dire l'image est dans le coin en bas à droite de la UIView. Je voudrais faire une transformation de rotation (CGAffineTransformMakeRotation) au centre de cette image, cependant, par défaut la rotation de la commande de rotation autour du centre de la UIView elle-même. En conséquence, mon image se déplace autour de l'écran lorsque je tourne au lieu de rester en place et tourne autour de son propre centre.

D'après ce que j'ai compris, je dois traduire mon contexte afin que l'origine (centre du UIView) est au centre de mon image, Faire pivoter, puis restaurer le contexte en traduisant de retour à l'endroit d'origine.

Ce qui suit est le plus proche chose que j'ai appris à travailler, mais le problème est que si l'image tourne, il se déplace vers le bas pendant qu'il est en rotation. Je pense que cela est dû à l'animation interpoler la 1ère étape et 3ème étape traduire à traduire au lieu de simplement se rendant compte que le début et la fin sur les translatés 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 j'ai ai combattu avec pendant des jours et ma solution actuelle semble proche, mais aucune idée de comment se débarrasser de cette tweening Translating. Quelqu'un at-il une solution pour cela ou une meilleure façon d'aller à ce sujet?

[mise à jour] Pour le moment je dessine mon image centrée au centre de la UIView puis définir la propriété UIView.center à l'origine je voudrais tourner et faire ensuite la commande rotate. On dirait un peu un hack, mais jusqu'à ce que je peux obtenir le vrai travail translatés c'est mon seul choix. Merci!

Était-ce utile?

La solution

duncanwilcox » réponse est la bonne, mais il a quitté la partie où vous changez l'ancre de la couche de la vue sur le point que vous voulez tourner autour.

CGSize sz = theview.bounds.size;
// Anchorpoint coords are between 0.0 and 1.0
theview.layer.anchorPoint = CGPointMake(rotPoint.x/sz.width, rotPoint.y/sz.height);
[UIView beginAnimations:@"rotate" context:nil];
theview.transform = CGAffineTransformMakeRotation( 45. / 180. * M_PI );
[UIView commitAnimations];

Ceci est documenté ici: http: // développeur. apple.com/documentation/Cocoa/Conceptual/CoreAnimation_guide/Articles/Layers.html

Autres conseils

Ceci est également une option: un simple changement de base; -)

CGAffineTransform transform = CGAffineTransformMakeTranslation(x, y);
transform = CGAffineTransformRotate(transform, angle);
transform = CGAffineTransformTranslate(transform,-x,-y);

où est le centre (x,y) de rotation que vous aimez

La rotation se produit autour du Anchorpoint de la couche de la vue. La valeur par défaut pour le AnchorPoint est le centre (0,5, 0,5), de sorte que la rotation seule, sans la traduction devrait suffire.

fait un test rapide et cela fonctionne pour moi:

[UIView beginAnimations:@"rotate" context:nil];
self.transform = CGAffineTransformMakeRotation( 45. / 180. * 3.14 );
[UIView commitAnimations];

Si vous ne veulent pas d'une animation se produire , mais juste régler la nouvelle rotation, vous pouvez utiliser ceci:

CGFloat newRotation = 3.14f 

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.0]; // no tweening
CGAffineTransform transform = CGAffineTransformMakeRotation(newRotation);
self.transform = transform;
[UIView commitAnimations];

La rotation devrait en effet avoir lieu autour du centre de la UIView. Réglage du animationDuration à zéro ne tweening devraient Garanties arriver.

Assurez-vous que vous ne le faites pas 60 fois par seconde. Il est très tentant de créer jeu comme des animations avec ces outils. Ce genre d'animations ne sont pas exactement destiné à un cadre à base d'images, « beaucoup de sprites voler partout » jeu.

Pour cela - et je l'ai été dans cette voie -. La seule façon d'aller, est OpenGL

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top