2009-08-15 19 views
13

¿Cuál es el límite de tiempo para que dos pulsaciones se consideren un doble toque en el sistema operativo del iPhone?¿Doble toque o dos toques simples?

// Editar: ¿Por qué es esto importante?

Para manejar un solo toque y tocar dos veces de manera diferente, la guía de Apple dice que haga performSelector...afterDelay con un intervalo "razonable" al primer toque (y cancélelo más tarde si se detecta el segundo toque).

El problema es que si el intervalo es demasiado corto (0.1), la acción de un solo toque se realizará incluso al hacer doble clic (si se basa únicamente en tapCount). Si es demasiado largo (0.8), el usuario esperará innecesariamente para que se reconozca el toque único, cuando no hay posibilidad de un doble toque.

Tiene que ser exactamente el número correcto, para que funcione de manera óptima, pero definitivamente no es más pequeño, o hay una posibilidad de errores (simultáneo de un toque y doble toque).

+0

Es posible que desee especificar qué plataforma usted está planteando. – retracile

+0

retracile, revise las etiquetas. – JoshJordan

+0

@retracile: hay una etiqueta de "iphone" en esta pregunta (bueno, tal vez no estaba allí hace 35 segundos, cuando publicaste tu comentario); entonces, supongo que está en una plataforma de iphone ;-) –

Respuesta

11

Puede detectar cualquier cantidad de toque con solo tocar el botón. No es necesario jugar con NSTouches tampoco. Para todos los usuarios que buscan la solución, aquí está.

Estas simples líneas de código cumplen la función de funcionalidad de toque simple y doble.

UITapGestureRecognizer *doubleTapRecg = [[UITapGestureRecognizer alloc] 
              initWithTarget:self 
              action:@selector(doubleTapped:)]; 
    doubleTapRecg.delegate = self; 
    doubleTapRecg.numberOfTapsRequired = 2; 
    doubleTapRecg.numberOfTouchesRequired = 1; 
    [view addGestureRecognizer:doubleTapRecg]; 


    UITapGestureRecognizer *tapRecg = [[UITapGestureRecognizer alloc] 
             initWithTarget:self 
             action:@selector(tapped:)]; 
    tapRecg.delegate = self; 
    tapRecg.numberOfTapsRequired = 1; 
    tapRecg.numberOfTouchesRequired = 1; 
    [view addGestureRecognizer:tapRecg]; 
    [tapRecg requireGestureRecognizerToFail:doubleTapRecg]; 


    [doubleTapRecg release]; 
    [tapRecg release]; 
+2

Estoy cambiando la respuesta aceptada a esto, ya que parece la forma correcta de hacerlo hoy en día. Pero antes de comentar la respuesta anterior y llamar a la basura de otras respuestas, tenga en cuenta que fueron publicadas 3 años antes que la suya y antes de que existiera UITapGestureRecognizer;) –

+0

que era mi otra cuenta: D – yunas

+0

Sin temporizadores manuales o retrasos que lo fuercen a decidir cuántos msecs para esperar, increíble! – cprcrack

1

No creo que haya un límite de tiempo predeterminado, es lo que "se sienta" bien cuando lo pruebe. Apple tiene un ejemplo here, donde tampoco especifican una hora específica.

+0

Debe haber un límite, ya que el TapCount de UITouch no aumenta si los clics están separados por un segundo, pero sí si están muy juntos. –

5

En Foros de desarrolladores en developer.apple.com, un desarrollador de Apple dijo:

  • No hay intervalo de tiempo constante, pero la definición de todo el sistema está implícito en la actualidad la propiedad tapCount de UITouch.
  • No hay un valor predeterminado para este retraso y para el retraso de tocar y mantener.
  • SpringBoard tiene el valor codificado.

He enviado esto a Apple como bug 68405.

10
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 

    UITouch *touch = [touches anyObject]; 

    NSUInteger tapCount = [touch tapCount]; 

    switch (tapCount) { 
     case 1: 
      [self performSelector:@selector(singleTapMethod) withObject:nil afterDelay:.4]; 
      break; 
     case 2: 
      [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(singleTapMethod) object:nil]; 
      [self performSelector:@selector(doubleTapMethod) withObject:nil afterDelay:.4]; 
      break; 
     case 3: 
      [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(doubleTapMethod) object:nil]; 
      [self performSelector:@selector(tripleTapMethod) withObject:nil afterDelay:.4]; 
      break; 
     case 4: 
      [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(tripleTapMethod) object:nil]; 
      [self quadrupleTap]; 
      break; 
     default: 
      break; 
    } 

} 
@end 

para mí este código está trabajando prefectamenta bien .... :) el último mensaje fue alrededor de agosto 15 09 .... pero yo estaba pasando por el mismo problema por lo que se cree que compartir la solución que encontré ....

0

no estoy seguro si esto es la forma correcta de hacer las cosas, pero este código está funcionando bien para mí.

en mi archivo .h:

@interface MyViewController : UIViewController { 

int tapCount; 

} 
@property (nonatomic, assign)int tapCount; 
@end 

en mi archivo .m:

@synthesize tapCount; 

- (void)tapGesture:(UIGestureRecognizer*)gesture { 
    tapCount = tapCount + 1; 
    [self performSelector:@selector(correctTapCount) withObject:nil afterDelay:0.3]; 


} 
-(void)correctTapCount { 
    if (tapCount == 1) { 
     NSLog(@"Single Tap"); 
    } 
    if (tapCount == 2) { 
     NSLog(@"Double Tap"); 
    } 

    //reset TapCount 
    tapCount = 0; 
} 

Y aquí es donde agrego mi oyente grifo (que está en una UIImageView)

//add tap listener 
carImage.userInteractionEnabled = YES; 
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGesture:)]; 
[carImage addGestureRecognizer:tap]; 
[tap release]; 

¡Buena suerte y feliz codificación!

Cuestiones relacionadas