2011-07-05 12 views
16

Cuando el usuario solo toca mi vista, necesito un método específico para ejecutar. Cuando el usuario toca dos veces, necesito que se realice otro método.filtrado de tomas simples y dobles

El problema es que el doble toque desencadena el único toque, e introduce errores en mi lógica. No puedo usar UIGestureRecognizer porque necesito hacer un seguimiento de los puntos.

Intento algunos booleanos, pero no hay posibilidad. También probé la técnica cancel/perfomSelector-delay, pero no funciona (es extraño porque otras personas en otros foros dijeron que funciona, ¿tal vez la detección táctil del simulador es diferente?)

Estoy tratando de dejar que el usuario establecer la posición (arrastrar, rotar) de una pieza de tabla, pero necesito estar al tanto de las intersecciones de piezas, del clip al área de la placa, etc., por eso un booleano simple no resolverá el problema.

¡Gracias de antemano!

+0

debe publicar su código para cancelar el/perfomSelector de retardo, ya que eso funciona bien. – mackworth

Respuesta

44

Comprobar this, parece justo lo que busca:

A continuación el código para utilizar UITapGestureRecognizer para manejar solo toque y doble toque. El código está diseñado para que no active el evento de un solo toque si tenemos un evento de doble toque. El truco es utilizar requireGestureRecognizerToFail para pedir al único gesto de toque esperar a que el evento de doble toque falle antes de disparar. Por lo tanto, cuando el usuario toque en la pantalla, el único reconocedor de gestos de toque no disparará el evento hasta que se produzca el doble toque del reconocedor de gestos. Si el reconocedor de gestos de doble toque reconoce el evento, activará un evento de doble pestaña y omitirá el evento de un toque, de lo contrario activará un solo evento de toque.

UITapGestureRecognizer *doubleTapGestureRecognizer = [[UITapGestureRecognizer alloc] 
          initWithTarget:self action:@selector(handleDoubleTap:)]; 
    doubleTapGestureRecognizer.numberOfTapsRequired = 2; 

    //tapGestureRecognizer.delegate = self; 
    [self addGestureRecognizer:doubleTapGestureRecognizer]; 

    // 
    UITapGestureRecognizer *singleTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)]; 
    singleTapGestureRecognizer.numberOfTapsRequired = 1; 

    [singleTapGestureRecognizer requireGestureRecognizerToFail: doubleTapGestureRecognizer]; 
    //tapGestureRecognizer.delegate = self; 
    [self addGestureRecognizer:singleTapGestureRecognizer]; 

Posiblemente no entiendo exactamente lo que quiere decir con "Necesito hacer un seguimiento de los puntos", pero no veo ningún problema con hacer esto con un reconocedor gesto.

+0

Muchas gracias, funciona pero encuentro otro problema ... Tengo una variable de instancia CGPoint, que realiza un seguimiento del punto de inicio de arrastre (establecido en touchesBegan). Si el usuario arrastra la pieza a un lugar incorrecto (como en la parte superior de otra pieza), configuro la posición de la pieza en ese punto de inicio, en toques Ended.Pero si el usuario gira la pieza y establece un lugar incorrecto, mi punto de partida será reemplazado por el punto de contacto, y no seré capaz de 'reiniciar' la pieza al punto de inicio ... estoy confundido con ¡implemente este simple posicionamiento de pieza giratoria/gota! – Fernando

+0

Esto es excelente –

1

Swift Solución:

doubleTapSmall1.numberOfTapsRequired = 2 
    doubleTapSmall1.addTarget(self, action: "doubleTapPic1") 
    smallProfilePic1.addGestureRecognizer(doubleTapSmall1) 

    singleTapSmall1.numberOfTapsRequired = 1 
    singleTapSmall1.addTarget(self, action: "singleTapPic1") 
    singleTapSmall1.requireGestureRecognizerToFail(doubleTapSmall1) 
    smallProfilePic1.addGestureRecognizer(singleTapSmall1) 
1

Swift 3 Solución:

doubleTap = UITapGestureRecognizer(target: self, action:#selector(self.doubleTapAction(_:))) 
doubleTap.numberOfTapsRequired = 2 


singleTap = UITapGestureRecognizer(target: self, action:#selector(self.singleTapAction(_:))) 
singleTap.numberOfTapsRequired = 1 

singleTap.require(toFail: doubleTap) 

self.view.addGestureRecognizer(doubletap) 
self.view.addGestureRecognizer(singleTap) 

En la línea de código singleTap.require (Tofail: DoubleTap) estamos forzando el solo toque a espere y asegúrese de que el grifo no sea un doble toque. Lo que significa que estamos solicitando que se asegure que el evento de doble toque haya fallado, por lo tanto, se concluye con un solo toque.

0

Simplemente implemente los métodos de delegado UIGestureRecognizer configurando el delegado correctamente.

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{ 
      return YES; 
     } 

    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{ 
     return YES; 
    } 

También añadir esta línea de código

[singleTap requireGestureRecognizerToFail:doubleTap]; 
Cuestiones relacionadas