2012-01-30 13 views
7

Tengo una vista que el usuario puede pellizcar para crecer o achicarse. Me gustaría que esto funcione a lo largo de dos ejes: si el pellizco es mayormente horizontal, crecerá/contraerá el objeto horizontalmente, pero si el pellizco es mayormente vertical, crecerá/contraerá el objeto verticalmente.¿Puedo usar UIPinchGestureRecognizers para distinguir entre pellizcos horizontales y verticales?

¿Puedo lograr esto con uno o dos reconocedores de pellizco, y si es así, cómo?

Respuesta

12

Es posible que pueda usar un UIPinchGestureRecognizer para esto, pero deberá escribir el código para determinar si el pellizco es horizontal o vertical. No he probado esto:

typedef enum { 
    PinchAxisNone, 
    PinchAxisHorizontal, 
    PinchAxisVertical 
} PinchAxis; 

PinchAxis pinchGestureRecognizerAxis(UIPinchGestureRecognizer *r) { 
    UIView *view = r.view; 
    CGPoint touch0 = [r locationOfTouch:0 inView:view]; 
    CGPoint touch1 = [r locationOfTouch:1 inView:view]; 
    CGFloat tangent = fabsf((touch1.y - touch0.y)/(touch1.x - touch0.x)); 
    return 
     tangent <= 0.2679491924f ? PinchAxisHorizontal // 15 degrees 
     : tangent >= 3.7320508076f ? PinchAxisVertical // 75 degrees 
     : PinchAxisNone; 
} 
+0

¡Gran enfoque! – perrohunter

+0

Agradable, pero 1. Supongo que quiere decir 'fabsf ((touch1.y - touch0.y)/(touch1.x - touch0.x))', con 'x' para el último componente. 2. Primero debe verificar si la vertical es perfecta, 'if (touch1.x == touch0.x) return PinchAxisVertical;' para evitar dividir por cero; 3. Tenga en cuenta que esto prueba el ángulo de sus dos dedos uno con respecto al otro, no el movimiento relativo de sus dedos. La trigonometría básica podría aplicarse a algo que realmente mirara los deltas, pero esto es más un "ángulo de la posición de los dedos" que un "ángulo del movimiento de los dedos". – Rob

+0

Tiene razón acerca de la última 'y' que necesita ser una' x'. Lo he arreglado Gracias por anotarlo. Sin embargo, no es necesario verificar la división por cero, ya que producirá infinito de coma flotante, que la expresión condicional siguiente maneja correctamente. –

Cuestiones relacionadas