toque sirve que para pantalla home doble clic boton baja iphone uigesturerecognizer

pantalla - para que sirve el doble toque en el iphone 7



UITapGestureRecognizer: un solo toque y doble toque (9)

Estoy tratando de agregar 2 UITapGestureRecognizers a una vista, una para un solo toque y otra para los eventos de doble toque. El reconocedor de un solo toque funciona como se esperaba (solo). Pero parece que no puedo hacer funcionar el reconocedor de doble toque.

He intentado experimentar con propiedades como: cancelsTouchesInView , delaysTouchesBegan y delaysTouchesEnded pero aún no funciona.

Cuando toco dos veces, el reconocedor de un solo toque siempre se activará y el evento de doble toque también se enviará a la súper vista. Pero el reconocedor de doble toque personalizado no parece ser notificado en absoluto.

La documentación parece sugerir que las 3 propiedades mencionadas anteriormente podrían usarse para este propósito. Pero no estoy seguro de qué valores se deben establecer y de qué reconocedor (es) (único, doble o ambos). Espero que alguien familiarizado con esto pueda ayudar.

El siguiente es el último bloque de código actualizado.

// ****** gesture recognizers ****** - (void)addSingleAndDoubleTapGestureRecognizersToView:(UIView *)view { // single tap UITapGestureRecognizer *singleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget: tableViewController action: @selector(handleSingleTapOnView:)]; [singleTapRecognizer setNumberOfTouchesRequired:1]; [view addGestureRecognizer: singleTapRecognizer]; // double tap UITapGestureRecognizer *doubleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget: tableViewController action: @selector (handleDoubleTapOnView:)]; [doubleTapRecognizer setNumberOfTouchesRequired:2]; [singleTapRecognizer requireGestureRecognizerToFail: doubleTapRecognizer]; [view addGestureRecognizer: doubleTapRecognizer]; } - (void)handleSingleTapOnView:(id)sender { } - (void)handleDoubleTapOnView:(id)sender { }


// ---- primero tienes que asignar el gesto de toque doble e individual ------- //

UITapGestureRecognizer* doubleTap = [[UITapGestureRecognizer alloc] initWithTarget : self action : @selector (handleDoubleTap:)]; UITapGestureRecognizer* singleTap = [[UITapGestureRecognizer alloc] initWithTarget : self action : @selector (handleSingleTap:)]; [singleTap requireGestureRecognizerToFail : doubleTap]; [doubleTap setDelaysTouchesBegan : YES]; [singleTap setDelaysTouchesBegan : YES];

// ----------------------- número de toque ---------------- //

[doubleTap setNumberOfTapsRequired : 2]; [singleTap setNumberOfTapsRequired : 1];

// ------- agregue dos toques y un solo toque en la vista o el botón -------- //

[self.view addGestureRecognizer : doubleTap]; [self.view addGestureRecognizer : singleTap];


Algunas vistas tienen sus propios reconocimientos de doble toque integrados ( MKMapView es un ejemplo). Para evitar esto, deberá implementar el método shouldRecognizeSimultaneouslyWithGestureRecognizer y devolver YES :

Primero implemente sus reconocedores dobles y únicos:

// setup gesture recognizers UITapGestureRecognizer* singleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(mapViewTapped:)]; singleTapRecognizer.delegate = self; singleTapRecognizer.numberOfTapsRequired = 1; UITapGestureRecognizer* doubleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(mapViewDoubleTapped:)]; doubleTapRecognizer.delegate = self; // this allows doubleTapRecognizer.numberOfTapsRequired = 2; [singleTapRecognizer requireGestureRecognizerToFail:doubleTapRecognizer];

Y luego implementar:

#pragma mark UIGestureRecognizerDelegate - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { return YES; }


En referencia al comentario de @ stanley:

No intente utilizar gestos de tap para seleccionar las filas para que funcionen en UITableView ya que tiene un manejo completo de los grifos ....

Pero debe establecer ''Cancela toques en la vista'' a ''NO'' en sus únicos reconocimientos de gestos táctiles o nunca obtendrá los eventos tap.


Implementé los métodos UIGestureRecognizerDelegate para detectar singleTap y doubleTap.

Solo haz esto.

UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleDoubleTapGesture:)]; [doubleTap setDelegate:self]; doubleTap.numberOfTapsRequired = 2; [self.headerView addGestureRecognizer:doubleTap]; UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleSingleTapGesture:)]; singleTap.numberOfTapsRequired = 1; [singleTap setDelegate:self]; [doubleTap setDelaysTouchesBegan:YES]; [singleTap setDelaysTouchesBegan:YES]; [singleTap requireGestureRecognizerToFail:doubleTap]; [self.headerView addGestureRecognizer:singleTap];

Luego implemente estos métodos de delegado.

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


Necesita usar el método requireGestureRecognizerToFail: Algo como esto:

[singleTapRecognizer requireGestureRecognizerToFail:doubleTapRecognizer];


No estoy seguro de si eso es exactamente lo que está buscando, pero hice taps individuales / dobles sin reconocedores de gestos. Lo estoy usando en una UITableView, así que utilicé ese código en el método didSelectRowAtIndexPath

tapCount++; switch (tapCount) { case 1: //single tap [self performSelector:@selector(singleTap:) withObject: indexPath afterDelay: 0.2]; break; case 2: //double tap [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(singleTap:) object:indexPath]; [self performSelector:@selector(doubleTap:) withObject: indexPath]; break; default: break; } if (tapCount>2) tapCount=0;

Los métodos singleTap y doubleTap son nulos con NSIndexPath como parámetro:

- (void)singleTap:(NSIndexPath *)indexPath { //do your stuff for a single tap } - (void)doubleTap:(NSIndexPath *)indexPath { //do your stuff for a double tap }

Espero eso ayude


Solución para Swift 2:

let singleTapGesture = UITapGestureRecognizer(target: self, action: #selector(handleSingleTap)) singleTapGesture.numberOfTapsRequired = 1 // Optional for single tap view.addGestureRecognizer(singleTapGesture) let doubleTapGesture = UITapGestureRecognizer(target: self, action: #selector(handleDoubleTap)) doubleTapGesture.numberOfTapsRequired = 2 view.addGestureRecognizer(doubleTapGesture) singleTapGesture.requireGestureRecognizerToFail(doubleTapGesture)


Solución Swift 3:

let singleTap = UITapGestureRecognizer(target: self, action:#selector(self.singleTapAction(_:))) singleTap.numberOfTapsRequired = 1 view.addGestureRecognizer(singleTap) let doubleTap = UITapGestureRecognizer(target: self, action:#selector(self.doubleTapAction(_:))) doubleTap.numberOfTapsRequired = 2 view.addGestureRecognizer(doubleTap) singleTap.require(toFail: doubleTap)

En la línea de código singleTap.require (toFail: doubleTap) estamos forzando a que el único toque espere y asegúrese de que el evento Tap no sea un doble toque.


UITapGestureRecognizer *singleTap = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doSingleTap)] autorelease]; singleTap.numberOfTapsRequired = 1; [self.view addGestureRecognizer:singleTap]; UITapGestureRecognizer *doubleTap = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doDoubleTap)] autorelease]; doubleTap.numberOfTapsRequired = 2; [self.view addGestureRecognizer:doubleTap]; [singleTap requireGestureRecognizerToFail:doubleTap];

Nota: Si está usando numberOfTouchesRequired tiene que ser .numberOfTouchesRequired = 1;