iphone sdk CGAffineTransform obtener el ángulo de rotación de un objeto

¿Cómo calculo el ángulo de rotación para cualquier objeto dado (es decir, una vista de uiimage)?

Técnicamente no se puede, porque la transformación puede incluir una operación sesgada 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 

Puedes recuperar el ángulo con

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

Puede obtener fácilmente el ángulo de rotación de esta 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 

De la documentación :

Core Animation amplía el protocolo de encoding 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 las rutas clave para las que las propiedades transform y sublayerTransform de una capa son clave-valor de encoding y observación conforme

O puede usar las funciones acos y asin. Obtendrás exactamente el mismo resultado:

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

Puedes probar 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); }