2010-01-12 13 views

Respuesta

84

Técnicamente no se puede, porque la transformación puede incluir una operación skew que convierte la imagen en un paralelogramo y el ángulo de rotación ya no está definido.

De todos modos, ya que la matriz de rotación genera

cos(x) sin(x) 0 
-sin(x) cos(x) 0 
    0  0  1 

Puede recuperar el ángulo con

return atan2(transform.b, transform.a); 
+0

gracias :) exactamente lo que necesitaba – nathanjosiah

+1

lo es transform.b y transform.a? son b y las propiedades de una transformada? nunca he visto esos. – openfrog

+2

@openfrog: http://developer.apple.com/iphone/library/documentation/GraphicsImaging/Reference/CGAffineTransform/Reference/reference.html#//apple_ref/doc/uid/TP30000946-CH2g-BBCJFFAE – kennytm

3

O puede utilizar acos y funciones asin. Obtendrá exactamente el mismo resultado:

NSLog (@"%f %f %f", acos (MyView.transform.a), asin (MyView.transform.b), atan2(MyView.transform.b, MyView.transform.a)); 
+3

La identidad que sugiere solo es cierto si no hay escalado. Si también hay escalado, debe usar la función atan(). –

+0

muy útil, tiro y respuesta fácil +1 –

35

usted puede conseguir fácilmente el ángulo de la rotación de la siguiente manera:

CGFloat angle = [(NSNumber *)[view valueForKeyPath:@"layer.transform.rotation.z"] floatValue]; 

Por ejemplo:

view.transform = CGAffineTransformMakeRotation(0.02); 
CGFloat angle = [(NSNumber *)[view valueForKeyPath:@"layer.transform.rotation.z"] floatValue]; 
NSLog(@"%f", angle); // 0.020000 

Desde el documentation:

Core Animation amplía el protocolo de codificación de valores-clave para permitir obtener y establecer los valores comunes de la matriz CATransform3D de una capa a través de las rutas clave. La Tabla 4 describe los caminos principales para que transforman de una capa y las propiedades sublayerTransform son clave-valor de codificación y observando compatible

+0

¿Dónde está la documentación para esto? Si bien esto es bueno, no estoy seguro de que pase la inspección de Apple. –

+2

@ RichardJ.RossIII - Aquí está: https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CoreAnimation_guide/Articles/Layers.html#//apple_ref/doc/uid/TP40006082-SW17 – sch

+0

Una gran respuesta, me salvó de un gran problema. +1 –

0

Usted puede tratar con esto:

- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    CGPoint newLocationPoint = [[touches anyObject] locationInView:self.superview]; 
    int x = self.center.x; 
    int y = self.center.y;  
    float dx = newLocationPoint.x - x; 
    float dy = newLocationPoint.y - y;  
    double angle = atan2(-dx,dy); 
    self.layer.position = self.center; 
    self.layer.transform = CATransform3DMakeRotation(angle, 0, 0, 1); 
    NSLog(@"touchesMoved %f %f %d,%d %f,%f angle:%f",newLocationPoint.x,newLocationPoint.y,x,y,dx,dy,angle);  
} 
Cuestiones relacionadas