2009-03-02 8 views
1

Mon code utilisateur est une application iphone où je fais une animation sur l'échelle, la rotation et la translation d'une image.Comment gérer une translation Matrice dans un point de vue de l'axe Y inversé

Alors, je concat tout et le nourrir à la propriété de transformer, mais il y a un problème:

Depuis mes images varient en taille, il est un problème pour les positionner correctement. Je suis habitué à un système de coordonnées d'axe y inversé, donc je veux que mon image soit positionnée exactement à 60 pixels dans l'axe y. Donc, comment est-ce que je change de l'axe Y original cartésien à un point de vue de l'axe Y inversé?

Répondre

4

Comme SMACL souligne, la meilleure façon de le faire est de déplacez votre origine en bas à gauche de l'écran en utilisant (screenheight - viewheight - y) au lieu de y dans les origines de vos vues. Toutefois, vous pouvez inverser le système de coordonnées des calques de votre vue principale à l'aide d'un CATransform3D. Je fais cela pour que je puisse partager le même code de disposition Core Animation CALayer entre mon application iPhone et un client Mac (l'iPhone inverse le système de coordonnées Quartz normal pour que CALayers corresponde à celui des UIViews). Tout ce que vous devez faire pour activer est de placer la ligne

self.layer.sublayerTransform = CATransform3DMakeScale(1.0f, -1.0f, 1.0f); 

dans votre code d'initialisation pour votre UIView couche d'hébergement. Rappelez-vous que cela va retourner votre CALayers, de sorte que tout le rendu du texte UIKit dans ces couches peut également être basculée en utilisant un code similaire à ce qui suit:

CGContextSaveGState(context); 
CGContextTranslateCTM(context, 0.0f, self.frame.size.height); 
CGContextScaleCTM(context, 1.0f, -1.0f); 

UIFont *theFont = [UIFont fontWithName:@"Helvetica" size:fontSize]; 
[text drawAtPoint:CGPointZero withFont:theFont]; 

CGContextRestoreGState(context); 

Vous pouvez faire une sorte similaire d'inversion à l'aide d'un CGAffineTransform, mais vous devra également appliquer une traduction pour faire ce travail:

CGAffineTransform flipTransform = CGAffineTransformMakeTranslation(0.0f, self.frame.size.height); 
flipTransform = CGAffineTransformScale(flipTransform, 1.0f, -1.0f); 

Vous pourriez être en mesure d'utiliser la transformation affine pour convertir votre origine coordonnées à l'aide CGPointApplyAffineTransform().

0

Pour chaque y ordonnée, y = top-y, en haut est l'y ordonnée de la partie supérieure de la zone de délimitation que vous sucez.

Questions connexes