Question

Mon cas d'utilisation est une application pour iPhone où je réalise une animation sur l'échelle, la rotation et la traduction d'une image.

Donc, je concatre tout et l'envoie à la propriété de transformation, mais il y a un problème:

Étant donné que la taille de mes images varie, il est difficile de les positionner correctement. Je suis habitué au système de coordonnées en ordonnée inversé. Je souhaite donc que mon image soit positionnée exactement à 60 pixels sur l’axe des ordonnées.

Alors, comment puis-je passer de l'axe y cartésien d'origine à un point de vue axe y inversé?

Était-ce utile?

La solution

Comme le fait remarquer smacl, le moyen le plus simple de le faire est de déplacer votre origine en bas à gauche de l'écran en utilisant (screenheight - viewheight - y) au lieu de y dans l'origine de vos vues.

Cependant, vous pouvez inverser le système de coordonnées des calques de votre vue principale à l'aide de CATransform3D. Pour ce faire, je peux partager le même code de mise en page 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 de UIViews). Pour l'activer, il suffit de placer la ligne

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

dans votre code d'initialisation pour votre hébergement de couche UIView. N'oubliez pas que cela retourne vos CALayers. Par conséquent, il peut être nécessaire d'inverser le rendu du texte UIKit dans ces couches à l'aide d'un code similaire à celui-ci:

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 effectuer un type d'inversion similaire à l'aide d'un CGAffineTransform, mais vous devrez également appliquer une traduction pour que cela fonctionne:

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

Vous pourrez peut-être utiliser la transformation affine pour convertir vos coordonnées d'origine à l'aide de CGPointApplyAffineTransform ().

Autres conseils

Pour chaque ordonnée y, y = top-y, où top correspond à l'ordonnée y du haut du cadre de sélection que vous dessinez.

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