ios cgaffinetransform

ios - ¿Acerca de la dirección de rotación de CGAffineTransformMakeRotation?



(5)

Estoy tratando de usar CGAffineTransformMakeRotation, y me refiero a un documento de Apple que dice

El ángulo, en radianes, mediante el cual esta matriz rota los ejes del sistema de coordenadas. En iOS, un valor positivo especifica la rotación en sentido contrario a las agujas del reloj y un valor negativo especifica la rotación en el sentido de las agujas del reloj . En OS X, un valor positivo especifica la rotación en el sentido de las agujas del reloj y un valor negativo especifica la rotación en sentido contrario a las agujas del reloj.

Por lo tanto, paso el parámetro 90 grados, debe girar hacia la izquierda.
self.myView es una vista de color de fondo gris, y la vista de cuadrado rojo es solo para ver la dirección de rotación

#define DEGREES_TO_RADIANS(x) (x * M_PI/180.0) CGAffineTransform rotation = CGAffineTransformMakeRotation( DEGREES_TO_RADIANS(90) ); [self.myView setTransform:rotation];


Pero ¿por qué la rotación a la derecha?
Estoy tratando de usarlo en el simulador y el dispositivo tiene el mismo resultado, rotación hacia la derecha
Y luego tring para usar la animación:

#define DEGREES_TO_RADIANS(x) (x * M_PI/180.0) CGAffineTransform rotation = CGAffineTransformMakeRotation( DEGREES_TO_RADIANS(90) ); [UIView animateWithDuration:0.5 animations:^{ self.myView.transform = rotation; } completion:^(BOOL finished) { NSLog(@"%@", NSStringFromCGAffineTransform(self.myView.transform)); }];

Tiene el mismo resultado, rotación hacia la derecha.

Alguien puede explicar por qué, Gracias por la respuesta.


Este es realmente el comportamiento correcto, y la documentación lo describe correctamente.

Estás tratando con dos sistemas de coordenadas diferentes aquí. El sistema de coordenadas de Core Graphics tiene (0, 0) en la parte inferior izquierda, pero el sistema de coordenadas de UIKit tiene (0, 0) en la parte superior izquierda. Ambos sistemas de coordenadas tienen un eje X con 0 a la izquierda. En otras palabras, el sistema de coordenadas de UIKit es el sistema de coordenadas de Core Graphics invertido verticalmente. La siguiente imagen muestra la diferencia:

Ahora, veamos su cita:

El ángulo, en radianes, mediante el cual esta matriz rota los ejes del sistema de coordenadas. En iOS, un valor positivo especifica la rotación en sentido contrario a las agujas del reloj y un valor negativo especifica la rotación en el sentido de las agujas del reloj.

A primera vista eso parece mal, pero te has perdido algo. Esta es una cita de la referencia CGAffineTransformMakeRotation . Esto es parte de la referencia de Core Graphics , no de la referencia de UIKit. Se refiere a la rotación como a la izquierda en el sistema de coordenadas de Core Graphics .

Puede imaginarse esta rotación en su cabeza girando verticalmente lo que está viendo en la pantalla e imaginando cómo se vería la rotación.

De hecho, la referencia CGAffineTransformMakeRotation tiene un elemento de discusión que continúa documentando esto:

La dirección real de rotación depende de la orientación del sistema de coordenadas de la plataforma de destino, que es diferente en iOS y macOS.

El tema de discusión sobre la referencia del método rotate (by :) de CGContext describe un poco mejor este comportamiento:

La dirección en la que se gira el contexto puede verse alterada por el estado de la matriz de transformación actual antes de ejecutar esta función. Por ejemplo, en iOS, una UIView aplica una transformación al contexto de gráficos que invierte el eje Y (al multiplicarlo por -1). Al rotar el sistema de coordenadas del usuario en el sistema de coordenadas que se giró previamente, se produce una rotación en la dirección opuesta (es decir, los valores positivos parecen rotar el sistema de coordenadas en el sentido de las agujas del reloj).


Este es un error en la documentación.

Here describen la matriz y proporcionan las ecuaciones que utilizan para hacer la transformación:

Si haces los cálculos, verás que para ángulos positivos , da rotación en sentido contrario a las agujas del reloj cuando la dirección del eje Y es hacia arriba como en OS X y hacia la derecha cuando el eje Y se dirige hacia abajo como en iOS

Por ejemplo, puede intentar transformar el punto (5,0) con 90 grados, obtendrá (0,5), lo que significa en el sentido de las agujas del reloj para iOS y en el sentido contrario a las agujas del reloj para OS X.

La misma pieza de documentación aún tiene la parte (falsa) que citó:

En iOS, un valor positivo especifica la rotación en sentido contrario a las agujas del reloj y un valor negativo especifica la rotación en el sentido de las agujas del reloj. En OS X, un valor positivo especifica la rotación en el sentido de las agujas del reloj y un valor negativo especifica la rotación en sentido contrario a las agujas del reloj.

Lo que es claramente incorrecto , porque las ecuaciones (que son parte del mismo documento y son ecuaciones de rotación bastante estándar ) dicen lo contrario.


No te confundas. Está mal en la documentación de Apple.

CGAffineTransformMakeRotation (-angle) // para la rotación antihoraria CGAffineTransformMakeRotation (ángulo) // para la rotación hacia la derecha


Para obtener rotación en sentido antihorario ... haga su ángulo en -ve, por ejemplo:

*

imageToBeRotated.transform = CGAffineTransformMakeRotation(-angle); // for anti-clockwise rotation imageToBeRotated.transform = CGAffineTransformMakeRotation(angle); // for clockwise rotation

*


Tengo un código simple para rotar la imagen en dirección diferente.

int Count==1; - (IBAction)Btn_Image:(id)sender { if (Count==1) { Count = Count + 1; UIImage *image = [UIImage imageWithCGImage:self.Img_Selected.CGImage scale:1.0 orientation:UIImageOrientationRight]; self.Img_Canvas.image = image; } else if (Count == 2) { Count = Count + 1; UIImage *image = [UIImage imageWithCGImage:self.Img_Selected.CGImage scale:1.0 orientation:UIImageOrientationDown]; self.Img_Canvas.image = image; } else if (Count == 3) { Count = Count + 1; UIImage *image = [UIImage imageWithCGImage:self.Img_Selected.CGImage scale:1.0 orientation:UIImageOrientationLeft]; self.Img_Canvas.image = image; } else if (Count == 4) { Count = 1; UIImage *image = [UIImage imageWithCGImage:self.Img_Selected.CGImage scale:1.0 orientation:UIImageOrientationUp]; self.Img_Canvas.image = image; }}