Pregunta

Mi caso de uso es una aplicación para iPhone en la que hago una animación sobre la escala, la rotación y la traducción de una imagen.

Entonces, concatino todo y lo envío a la propiedad transform, pero hay un problema:

Como mis imágenes varían en tamaño, es un problema colocarlas correctamente. Estoy acostumbrado a un sistema de coordenadas de eje y invertido, por lo que quiero que mi imagen se coloque exactamente a 60 píxeles en el eje y.

Entonces, ¿cómo cambio del eje cartesiano y original al punto de vista del eje y invertido?

¿Fue útil?

Solución

Como señala smacl, la forma más sencilla de hacerlo es cambiar su origen a la parte inferior izquierda de la pantalla usando (screenheight - viewheight - y) en lugar de y en los orígenes de sus vistas.

Sin embargo, puede cambiar el sistema de coordenadas de las capas de su vista principal utilizando un CATransform3D. Hago esto para poder compartir el mismo código de diseño de Core Animation CALayer entre mi aplicación de iPhone y un cliente de Mac (el iPhone invierte el sistema de coordenadas de cuarzo normal para que CALayers coincida con el de UIViews). Todo lo que necesita hacer para habilitar esto es colocar la línea

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

en su código de inicialización para su UIView de alojamiento de capas. Recuerde que esto hará que sus CALayers cambien, por lo que cualquier reproducción de texto UIKit en esas capas también puede necesitar un código similar al siguiente:

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);

Puede realizar una inversión similar utilizando un CGAffineTransform, pero también deberá aplicar una traducción para que funcione:

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

Es posible que pueda utilizar la transformación afín para convertir sus coordenadas de origen utilizando CGPointApplyAffineTransform ().

Otros consejos

Para cada ordenada y, y = top-y, donde top es la ordenada y de la parte superior del cuadro delimitador en el que está dibujando.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top