2010-10-25 22 views
5

Estoy trabajando en una aplicación de iPhone que requiere que compruebe si el botón se ha pulsado & presionado durante 6 segundos & y luego ejecuta una acción que reproduce algún tipo de sonido.detectando un toque largo en el iPhone

¿Cómo debo detectar este toque de 6 segundos?

Por otro lado, el usuario también puede seguir presionando el botón durante 6 segundos & y luego debe disparar la misma acción.

¿Qué debo hacer con múltiples toques, cómo sabría que todos los topes caen debajo del soporte de 6 segundos?

Respuesta

17

Para un niño de seis segunda pulsación larga, utilice un UILongPressGestureRecognizer con su minimumPressDuration propiedad establecida en 6.

Escriba su propia gesture recognizer (por ejemplo, LongTappingGestureRecognizer) para la colada continua durante un período determinado; no debería ser demasiado complicado. Bríndele una propiedad como minimumPressDuration (por ejemplo, minimumTappingDuration) y una propiedad (por ejemplo, maximumLiftTime) que determina cuánto tiempo se puede levantar un dedo antes de que no se lo considere un gesto prolongado.

  • Cuando recibe por primera vez touchesBegan:withEvent:, registre la hora.
  • Cuando recibe touchesEnded:withEvent:, inicie NSTimer (el temporizador de elevación) que envía un mensaje de cancelación al reconocedor de gestos (por ejemplo, cancelRecognition) después de maximumLiftTime.
  • Cuando recibe touchesBegan:withEvent: cuando hay una hora de inicio, cancele el temporizador de elevación (si lo hay).
  • El cancelRecognition pasará al failed state.

Hay varias estrategias para manejar el reconocimiento cuando se llega al final del gesto, después de minimumTappingDuration. Una es verificar en los controladores touchesBegan:withEvent: y touchesEnded:withEvent: si la diferencia entre la hora actual y la hora de inicio es> = minimumTappingDuration. El problema con esto es que tomará más de minimumTappingDuration reconocer el gesto si el usuario está tocando lentamente y su dedo está hacia abajo cuando se alcanza el minimumTappingDuration. Otro enfoque es iniciar otro NSTimer (el temporizador de reconocimiento) cuando se recibe el primer touchesBegan:withEvent:, uno que causará la transición al recognized state y que se cancela en cancelRecognition. Lo difícil aquí es qué hacer si el dedo se levanta cuando el temporizador se dispara. El mejor enfoque podría ser una combinación de los dos, ignorando el temporizador de reconocimiento si se levanta el dedo.

Hay más en los detalles, pero esa es la esencia. Básicamente, es un reconocedor de pulsación larga que permite al usuario levantar su dedo de la pantalla por breves períodos. Puede utilizar solo el reconocedor de tapping y omitir el reconocedor de pulsación larga.

0

Aquí está mi solución.

- (IBAction) micButtonTouchedDownAction { 
    self.micButtonTimer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(micButtonAction:) userInfo:nil repeats:YES]; 
    self.micButtonReleased = FALSE; 
} 

- (IBAction) micButtonTouchedUpInsideAction { 
    self.micButtonReleased = TRUE; 
} 

- (IBAction) micButtonTouchedUpOutsideAction { 
    self.micButtonReleased = TRUE; 
} 

- (void) micButtonAction:(NSTimer *)timer { 
    [self.micButtonTimer invalidate]; 
    self.micButtonTimer = nil; 

    if(self.micButtonReleased) { 
     NSLog(@"Tapped"); 
    } 
    else { 
     NSLog(@"Touched"); 
    } 
} 
9

Comprendo que esto es cuestión bastante anticuado, sin embargo, la respuesta debe ser bastante simple.

En su opinión controlador viewDidLoad:

//create long press gesture recognizer(gestureHandler will be triggered after gesture is detected) 
UILongPressGestureRecognizer* longPressGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(gestureHandler:)]; 
//adjust time interval(floating value CFTimeInterval in seconds) 
[longPressGesture setMinimumPressDuration:6.0]; 
//add gesture to view you want to listen for it(note that if you want whole view to "listen" for gestures you should add gesture to self.view instead) 
[self.m_pTable addGestureRecognizer:longPressGesture]; 
[longPressGesture release]; 

Luego, en su gestureHandler:

-(void)gestureHandler:(UISwipeGestureRecognizer *)gesture 
{ 
    if(UIGestureRecognizerStateBegan == gesture.state) 
    {//your code here 

    /*uncomment this to get which exact row was long pressed 
    CGPoint location = [gesture locationInView:self.m_pTable]; 
    NSIndexPath *swipedIndexPath = [self.m_pTable indexPathForRowAtPoint:location];*/ 
    } 
} 
+0

Fwiw, OP describe dos situaciones que deben ser reconocidos. Una es una sola pulsación larga (que este código detecta). El otro es un tapping repetido durante un período de seis segundos (que este código no detecta, ¿no?). De todos modos, el código anterior será útil para la mayoría de las personas, que solo quieren saber cómo establecer un requisito de longitud mínima para la pulsación larga. – ToolmakerSteve

Cuestiones relacionadas