2010-10-26 14 views
5

Actualmente estoy teniendo algunos conflictos con UIGestureRecognizers que está causando que todo se ponga bien entre sí. Tengo varios cuadrados (UIView) en la pantalla que permiten al usuario desplazarse y pellizcar (se usa para escalar las vistas). Tengo un UIPinchGestureRecognizer agregado a la vista principal que los cuadrados se agregan para que pueda escalar el cuadrado en el foco. También agregué UIPanGestureRecognizers a cada cuadrado para que se pueda mover en la pantalla. El problema se manifiesta cuando pellizco para escalar un cuadrado seleccionado mientras mis dedos se mueven a través de los otros. Basado en mi depuración, parece que si mis dedos pellizcadores atraviesan los cuadrados no enfocados se comen los toques que cancelan el gesto de pellizco. El uso de "[pan requireGestureRecognizerToFail: pizca]" otorga prioridad a la pizca, pero crea y genera problemas porque el reconocedor de panoramización continua ya no se dispara. También traté de agregar el UIPinchRecognizer directamente al cuadrado, pero funciona, pero el gesto tiene la restricción de estar dentro de los límites del cuadrado, lo que no funciona bien si el cuadrado se reduce demasiado. ¿Hay alguna forma de evitar esto? Me estoy perdiendo algo?iPhone - Conflictos con múltiples UIGestureRecognizers

+0

la aplicación suena similar a la [Touches_GestureRecognizers] (http://developer.apple.com/library/ios/#samplecode/Touches/Introduction/Intro.html%23//apple_ref/ doc/uid/DTS40007435) aplicación de ejemplo de Apple. Hace lo mismo con cuadrados y no parece tener el mismo problema. – Anna

+0

@ aBitOvious: Gracias, ese código de muestra es bastante bueno. @ Tim: No estoy estableciendo el delegado en absoluto ahora, así que definitivamente lo investigaré, ya que debería permitir controlar quién come qué. Sabré más una vez que investigo la fuente. – Dave

+0

Acabo de fusionar las seis cuentas basadas en cookies (y limpié todas las cosas aquí; la vida de un conserje nunca es fácil). Por favor considere registrar esta cuenta. – Will

Respuesta

3

Una forma de solucionar su problema sería establecer un único delegado común para todos sus UIGestureRecognizers (probablemente el UIViewController para esta vista). Ese delegado podría devolver NO para gestureRecognizerShouldBegin: (UIGestureRecognizer *) gestureRecognizer si el reconocedor de gestos de pellizco estaba en los estados "Began" o "Changed" (lo que significa que estaba reconociendo y procesando un pellizco). Eso debería evitar que cualquiera de los reconocedores de gestos de pano de comer toques durante un gesto de pellizco.

En el archivo de interfaz, que tendrá que guardar una referencia al reconocedor pizca gesto:

@interface MyViewController : UIViewController <UIGestureRecognizerDelegate> { 
    UIGestureRecognizer *pinchGestureRecognizer; 
} 

Y en la implementación, asegúrese de comprobar el estado del reconocedor pizca gesto, no el estado del gesto reconocedor se pasa:

@implementation MyViewController 

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer 
{ 
    if(pinchGestureRecognizer.state == UIGestureRecognizerStateBegan || 
    pinchGestureRecognizer.state == UIGestureRecognizerStateChanged) 
    { 
    return NO; 
    } 
    else 
    { 
    return YES; 
    } 
} 
+0

@ Tim: ¡Funcionó muy bien! Supongo que tengo muchos otros escenarios corriendo en mi mente y que por alguna razón no fue claro para mí, pero tiene mucho sentido. ¡Muchas gracias! Por cierto, ¿cómo respondes a las respuestas o editas tus publicaciones? ¿Tienes que estar conectado? Solo estoy usando campos de nombre. Gracias otra véz. – Dave

+0

Consulte la pregunta frecuente sobre el desbordamiento de pila "¿Qué es la reputación?" En pocas palabras, ganas reputación de otros usuarios haciendo y respondiendo buenas preguntas. En ciertos umbrales, obtienes privilegios como editar y comentar. Ya ganaste un representante (el 13 al lado de tu nombre) porque alguien "votó" esta pregunta (el 1 al lado de tu pregunta). –

+0

En realidad, como hizo esta pregunta, debería poder comentar cualquiera de las respuestas con el enlace "agregar un comentario" debajo de cada respuesta, aunque no tenga muchas repeticiones. En general, así es como la gente responde a las respuestas en lugar de hacer nuevas respuestas como lo hizo, pero no se preocupe ... –

Cuestiones relacionadas