2012-07-31 16 views
8

En mi experimento, concluyo siguientes:rotación CGAffineTransform va por el camino equivocado

YourView.transform = CGAffineTransformMakeRotation(positive value); 

girará la vista hacia la derecha, y

YourView.transform = CGAffineTransformMakeRotation(Negative value); 

a girar la vista hacia la izquierda,

Pero el el documento dice:

El ángulo, en radianes, por el cual girar la transfo affine rm. En iOS, un valor positivo especifica la rotación en sentido antihorario y un valor negativo especifica la rotación en el sentido de las agujas del reloj.

¿Se contradicen entre sí?

+0

lo he probado recientemente y obtengo los mismos resultados. los documentos sí especifican que en OSX tiene este comportamiento. pero no en ios como dijiste, muy raro. – Pochi

+0

¿Su 'valor' sucede ser π/2? –

+0

@ibeitia: sí, probé π/2 y -π/2 – romox

Respuesta

23

Tu confusión es bastante comprensible.

En verdad, un ángulo positivo representa una rotación desde el eje X positivo hacia el eje Y positivo. Un ángulo negativo representa una rotación desde el eje X positivo hacia el eje Y negativo.

El sistema de coordenadas Core "nativo" se modela según el estándar Cartesian coordinate system, en el que el eje Y aumenta hacia arriba en la página. En este sistema, un ángulo positivo representa una rotación en sentido antihorario:

normal coordinate system

Así que si usted crea su propia CGContext (por ejemplo, mediante el uso de CGBitmapContextCreate o CGPDFContextCreate), rotaciones funcionarán como se espera.

Sin embargo, los sistemas informáticos han utilizado históricamente un sistema de coordenadas en el que el eje Y aumenta hacia abajo en la página. En un sistema de coordenadas volteado como este, un ángulo positivo representa un giro a la derecha:

flipped coordinate system

Nótese que en ambos sistemas de coordenadas, un ángulo positivo gira desde el eje X positivo hacia el eje Y positivo.

Resulta que UIKit invierte el sistema de coordenadas de los contextos gráficos que crea para usted. Esto incluye el contexto de gráficos que configura antes de enviarle drawRect: y el contexto de gráficos que configura en UIGraphicsBeginImageContext. (El Quartz 2D Programming Guide lo explica). Puede verificar esto mirando la matriz de transformación actual (usando CGContextGetCTM). Encontrará que tiene un -1 en su elemento d, lo que significa que el eje Y se ha volteado.

A UIView también utiliza un sistema de coordenadas volteado para diseñar sus subvistas, lo que afecta el significado de la propiedad UIViewtransform.

+0

¡mucho, lo aprecio! – romox

+1

pero en un sistema de coordenadas volteado como ese, un ángulo positivo representa una rotación en el sentido de las agujas del reloj, pero los documentos dicen "En iOS, un valor positivo especifica la rotación en sentido antihorario". Entonces creo que todavía es contradictorio. Es el documento mal? – romox

+0

A veces está mal. Depende del contexto en el que use la transformación. –

Cuestiones relacionadas