¿cómo puedo calcular el ángulo de rotación de un objeto dado (es decir, un uiimageview)?

InformationsquelleAutor nathanjosiah | 2010-01-12

4 Comentarios

  1. 89

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

    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);
    • gracias 🙂 exactamente lo que yo necesitaba
    • ¿qué es transformar.b y transformar.una? son b y una de las propiedades de una transformación? nunca he visto esos.
    • href=»http://developer.apple.com/iphone/library/documentation/GraphicsImaging/Reference/CGAffineTransform/Reference/reference.html#//apple_ref/doc/uid/TP30000946-CH2g-BBCJFFAE» >developer.apple.com/iphone/library/documentation/…
  2. 36

    Usted puede conseguir fácilmente el ángulo de la rotación como este:

    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 se extiende el valor clave de codificación protocolo para permitir la obtención y establecimiento de los valores comunes de una capa CATransform3D de la matriz a través de los principales caminos. La tabla 4 describe las principales rutas de acceso para que una capa de transformación y sublayerTransform propiedades son la clave-valor de la codificación y de la observación compatible con

  3. 3

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

     NSLog (@"%f %f %f", acos (MyView.transform.a), asin (MyView.transform.b), atan2(MyView.transform.b, MyView.transform.a) );
    • La identidad que sugieren que sólo es cierto si no hay ninguna escala. Si hay escalado también, usted tiene que utilizar la atan() función.
    • muy útil, de tiro y de fácil respuesta +1
  4. 0

    Puedes probar con este:

    - (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);    
    }

Dejar respuesta

Please enter your comment!
Please enter your name here