2012-03-15 7 views
15

Estoy construyendo una aplicación de iPhone que permitiría al usuario reorganizar algunos de los elementos de la interfaz de usuario en la pantalla.iPhone iOS cómo agregar un UILongPressGestureRecognizer y UITapGestureRecognizer al mismo control y evitar conflictos?

¿Cómo puedo agregar un reconocedor de gestos de toque y un reconocedor de gestos de pulsación larga al mismo UIView? Cuando levanto el dedo de la pulsación larga, el reconocedor de gestos de toque se dispara. ¿Cómo puedo desactivar temporalmente el reconocedor de gestos de toque o evitar que se dispare cuando el usuario realiza una pulsación larga?

¡Gracias!

Respuesta

46

para permitir que tanto los gestos para trabajar juntos, poner en práctica el método siguiente delegado:

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

Para hacerlo de modo que la pulsación larga tiene primera prioridad, hacer:

[tapGesture requireGestureRecognizerToFail:longPress];

+0

quito el sombrero. buena respuesta. –

+0

sombrero también. esta última línea de código es lo que necesito. – dellos

0

Puedes ocuparte de eso en el código, que durante la pulsación larga, establecer una bandera, y si se toca el grifo mientras la bandera es verdadera o lo que sea, entonces no ejecutes el código de toque y reinicie la bandera. No sé una manera mejor

7

Como un enfoque alternativo, no tienen dos reconocedores separadas - sólo tiene que utilizar el reconocedor LongPress para ambos eventos:

Configurar la siguiente manera:

UILongPressGestureRecognizer* longPress = [ [ UILongPressGestureRecognizer alloc ] initWithTarget:self.nextResponder action:@selector(longPressEvent:)]; 
    categoryPanelDrag.minimumPressDuration = 0.0; 

Entonces manejan de la siguiente manera:

- (BOOL)longPressEvent:(UILongPressGestureRecognizer *)gesture { 

    // _dragStarted is a class-level BOOL 

    if(UIGestureRecognizerStateBegan == gesture.state) { 
     _dragStarted = NO; 
    } 

    if(UIGestureRecognizerStateChanged == gesture.state) { 
     _dragStarted = YES; 
     // Do dragging stuff here 
    } 

    if(UIGestureRecognizerStateEnded == gesture.state) { 

     if (_dragStarted == NO) 
     { 
      // Do tap stuff here 

     } 
     else 
     { 
      // Do drag ended stuff here 
     } 
    } 

    return YES; 

} 
+0

Esto no funciona – Softlion

+1

@Softlion no se olvide de la interfaz UIGestureRecognizerDelegate en el.h archivo :-) –

+0

Bueno, compila y ejecuta, pero no evita conflictos. Resolví el problema usando 2 reconocedores y gestureRecognizer (_: shouldRecognizeSimultaneouslyWithGestureRecognizer :) – Softlion

1

Yo probé Moby y el enfoque de oficial pero de alguna manera que no encajaba bien mi proyecto, por lo que resuelve como a continuación,

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{ 
    NSLog(@"%@ %ld",touch.description, touch.phase); 
    [self performSelector:@selector(checkTouch:) withObject:touch afterDelay:0.5]; 
    return YES; 
} 

y

- (void)checkTouch:(UITouch *)touch{ 
    NSLog(@"touch phase = %ld",touch.phase); 
    if (touch.phase == UITouchPhaseStationary) { 
     //still holding my hand and this means I wanted longPressTouch 
    } 
    if (touch.phase == UITouchPhaseEnded){ 
     //I released my finger so it's obviously tap 
    } 
} 

Podría ser solución más simple pero, por supuesto, depende del proyecto.

9

Para compatibilizar las dos cosas que necesita:

1º Añadir a la interfaz de delegado gesto en la cabecera

@interface ViewController : ViewController <UIGestureRecognizerDelegate> 

2º Crear eventos de gestos y añadir a una vista en el archivo fuente:

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(touch:)]; 
    [tap setNumberOfTapsRequired:1]; // Set your own number here 
    [tap setDelegate:self]; // Add the <UIGestureRecognizerDelegate> protocol 

    UILongPressGestureRecognizer *longTap = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longTouch:)]; 
    [longTap setNumberOfTapsRequired:0]; // Set your own number here 
    [longTap setMinimumPressDuration:1.0]; 
    [longTap setDelegate:self]; // Add the <UIGestureRecognizerDelegate> protocol 
    [tap requireGestureRecognizerToFail:longTap]; // Priority long 

    [self.view addGestureRecognizer:tap]; 
    [self.view addGestureRecognizer:longTap]; 

3º Agregar devoluciones de llamada en el archivo fuente:

- (void) touch: (UITapGestureRecognizer *)recognizer 
{ 
    CGPoint location = [recognizer locationInView: self.HUDview]; 
    if (recognizer.state == UIGestureRecognizerStateBegan) 
    { 
     NSLog(@"touch UIGestureRecognizerStateBegan"); 
    } 
    if (recognizer.state == UIGestureRecognizerStateEnded) 
    { 
     NSLog(@"touch UIGestureRecognizerStateEnded"); 
     //NSLog(@"Position of touch: %.3f, %.3f", location.x, location.y); // Position landscape 
    } 
} 

- (void) longTouch: (UILongPressGestureRecognizer *)recognizer 
{ 
    if (recognizer.state == UIGestureRecognizerStateBegan) 
    { 
     NSLog(@"longTouch UIGestureRecognizerStateBegan"); 
    } 
    if (recognizer.state == UIGestureRecognizerStateEnded) 
    { 
     NSLog(@"longTouch UIGestureRecognizerStateEnded"); 
    } 
} 

4º Conjunto reconocedor gesto disponibles:

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