ios - voltea - iphone sdk CGAffineTransform obtener el ángulo de rotación de un objeto
voltear fotos espejo (4)
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) );
¿Cómo calculo el ángulo de rotación para cualquier objeto dado (es decir, una vista de uiimage)?
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 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 las rutas clave para las que las propiedades transform y sublayerTransform de una capa son clave-valor de codificación y observación conforme
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);
}
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);