Pregunta

I necesita para coger dos gestos swipping diferentes usando UISwipeGestureRecognizer (por ejemplo, UISwipeGestureRecognizerDirectionRight y UISwipeGestureRecognizerDirectionLeft). Cuando agrego dos reconocedores diferentes con addGestureRecognizer método, obras reconocedor solamente agregados pasado. He leído que necesito para implementar gestureRecognizer: shouldRecognizeSimultaneouslyWithGestureRecognizer:. método de protocolo de UIGestureRecognizerDelegate, pero nada funciona

cualquier ayuda puede con un simple ejemplo de la captura de dos o más mismos gestos? Gracias!

¿Fue útil?

Solución

Fue muy fácil:

Al principio debemos crear la clase, que implementa el protocolo UIGestureRecognizerDelegate:

@interface MyGestureDelegate : NSObject <UIGestureRecognizerDelegate>

@implementation MyGestureDelegate

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

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

Y utilizar de esta manera:


    UISwipeGestureRecognizer *swipeGestureLeft = [[UISwipeGestureRecognizer alloc]
                                              initWithTarget:self action:@selector(handleSwipeGestureLeft:)];
    [self.view addGestureRecognizer:swipeGestureLeft];
    swipeGestureLeft.direction = UISwipeGestureRecognizerDirectionLeft;
    [swipeGestureLeft release];

    UISwipeGestureRecognizer *swipeGesture = [[UISwipeGestureRecognizer alloc]
                                          initWithTarget:self action:@selector(handleSwipeGesture:)];
    swipeGesture.direction = UISwipeGestureRecognizerDirectionRight;
    [self.view addGestureRecognizer:swipeGesture];

    MyGestureDelegate *deleg = [[MyGestureDelegate alloc] init];

    [swipeGesture setDelegate:deleg];
    [swipeGesture release];

Otros consejos

La respuesta: "Um, un rápido vistazo a la documentación ..." de Phoenix absolutamente no va a funcionar!

Se está estableciendo una máscara, a continuación, utilizando la misma variable a prueba como si el reconocedor la sacó y estableció un solo bit. Almacena, como él correctamente citado de la documentación:

  

Las direcciones permitidas del golpe

sender.direction

se devuelva la máscara se configura inicialmente y en su ejemplo, nunca resolver en una sola dirección!

UISwipeGestureRecognizerDirectionRight == 1
UISwipeGestureRecognizerDirectionRight | UISwipeGestureRecognizerDirectionLeft == 3

Adicionalmente, para la mayoría de los casos no es necesario que:

  • Configuración de un delegado
  • permite el reconocimiento de gestos simultánea (a menos que desee golpes simultáneos; no es probable)
  • enviar el reconocedor al selector

Los siguientes obras para mí:

   UISwipeGestureRecognizer* swipe;

   swipe = [[[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeL)] autorelease];
   swipe.direction = UISwipeGestureRecognizerDirectionLeft;
   [view addGestureRecognizer:swipe];

   swipe = [[[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeR)] autorelease];
   swipe.direction = UISwipeGestureRecognizerDirectionRight; // default
   [view addGestureRecognizer:swipe];

Um, un rápido vistazo a la documentación revelaría que usted está haciendo mucho más trabajo de lo que necesita:

"dirección La permitidas las direcciones del golpe.

@property(nonatomic) UISwipeGestureRecognizerDirection direction

discusión Es posible especificar varias direcciones especificando múltiples constantes UISwipeGestureRecognizerDirection utilizando bit a bit-O operandos. La dirección por defecto es UISwipeGestureRecognizerDirectionRight ".

Es decir, en lugar de utilizar dos UISwipeGestureRecognizers, sólo puede hacer lo siguiente:

UISwipeGestureRecognizer *swipeGesture = [[UISwipeGestureRecognizer alloc]
                                      initWithTarget:self action:@selector(handleSwipeGesture:)];

 swipeGesture.direction = UISwipeGestureRecognizerDirectionRight | UISwipeGestureRecognizerDirectionLeft;

Y en su método de acción:

  -(IBAction)handleSwipeGesture:(UISwipeGestureRecognizer*)sender
     {
     if (sender.direction == UISwipeGestureRecognizerDirectionLeft) {

         //do left action

     } else {

         //do right action

     }
}

Mucho más simple y mucho menos propensos al conflicto.

Yo sugeriría que lea un poco en la técnica que utilizan los reconocedores gesto de reconocer el gesto. Supongo, los primeros intentos reconocedor para reconocer el gesto, pero se da cuenta que no tiene que responder a ella y entonces de alguna manera que no pasa en.

Es muy útil para leer cómo trabajan con el fin de entender cómo usarlos.

Espero que esto ayude.

Gracias a la sugerencia de user294890, que tuvo éxito mediante la devolución de sí a partir de los métodos enumerados UIGestureRecognizerDelegate.

Sin embargo, me di cuenta de que no iba a funcionar cuando se estaba añadiendo el GestureRecognizer antes de la vista web había cargado. sin embargo, funcionaba cuando he añadido el GestureRecognizer a la web View en el método web View delegado:

- (void)webViewDidFinishLoad:(UIWebView *)webView.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top