Detecta cuando UIGestureRecognizer está arriba, abajo, izquierda y derecha Cocos2d

Tengo un CCSprite que quiero mover usando gestos. El problema es que soy completamente nuevo en Cocos2D. Quiero que mi sprite realice una acción cuando el gesto está arriba, otra cuando el gesto está abajo, otra acción cuando el gesto es correcto y lo mismo para el izquierdo. ¿Alguien me puede apuntar en la dirección correcta?

¡Gracias!

Aparentemente cada UISwipeGestureRecognizer solo puede detectar el deslizamiento en la dirección dada. A pesar de que las banderas de dirección podrían estar juntas, el UISwipeGestureRecognizer ignora los indicadores adicionales.

La solución es agregar un UISwipeGestureRecognizer para cada dirección en la que desea que se reconozca el gesto de deslizamiento, y establecer la dirección de cada reconocedor en función de arriba, abajo, izquierda y derecha. Si quieres probar un deslizamiento en cualquier dirección, deberás agregar cuatro UISwipeGestureRecognizers.

Es un poco extraño, pero esa es la única forma en que funcionó para mí.

UISwipeGestureRecognizer *swipeGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeGesture:)]; swipeGesture.direction = UISwipeGestureRecognizerDirectionUp|UISwipeGestureRecognizerDirectionDown; [self.gestureAreaView addGestureRecognizer:swipeGesture]; [swipeGesture release]; -(void)handleSwipeGesture:(UISwipeGestureRecognizer *) sender { //Gesture detect - swipe up/down , can't be recognized direction } or UISwipeGestureRecognizer *swipeGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeGesture:)]; swipeGesture.direction = UISwipeGestureRecognizerDirectionUp; [self.view addGestureRecognizer:swipeGesture]; [swipeGesture release]; UISwipeGestureRecognizer *swipeGesture2 = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeGesture:)]; swipeGesture2.direction = UISwipeGestureRecognizerDirectionDown; [self.view addGestureRecognizer:swipeGesture2]; [swipeGesture2 release]; -(void)handleSwipeGesture:(UISwipeGestureRecognizer *) sender { //Gesture detect - swipe up/down , can be recognized direction if(sender.direction == UISwipeGestureRecognizerDirectionUp) { } else if(sender.direction == UISwipeGestureRecognizerDirectionDown) { } } 

Use un UIPanGestureRecogizer y detecte las instrucciones de deslizamiento que le interesan. ver la documentación de UIPanGestureRecognizer para más detalles. -rrh

 // add pan recognizer to the view when initialized UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panRecognized:)]; [panRecognizer setDelegate:self]; [self addGestureRecognizer:panRecognizer]; // add to the view you want to detect swipe on -(void)panRecognized:(UIPanGestureRecognizer *)sender { if (sender.state == UIGestureRecognizerStateBegan) { // you might want to do something at the start of the pan } CGPoint distance = [sender translationInView:self]; // get distance of pan/swipe in the view in which the gesture recognizer was added CGPoint velocity = [sender velocityInView:self]; // get velocity of pan/swipe in the view in which the gesture recognizer was added float usersSwipeSpeed = abs(velocity.x); // use this if you need to move an object at a speed that matches the users swipe speed NSLog(@"swipe speed:%f", usersSwipeSpeed); if (sender.state == UIGestureRecognizerStateEnded) { [sender cancelsTouchesInView]; // you may or may not need this - check documentation if unsure if (distance.x > 0) { // right NSLog(@"user swiped right"); } else if (distance.x < 0) { //left NSLog(@"user swiped left"); } if (distance.y > 0) { // down NSLog(@"user swiped down"); } else if (distance.y < 0) { //up NSLog(@"user swiped up"); } // Note: if you don't want both axis directions to be triggered (ie up and right) you can add a tolerence instead of checking the distance against 0 you could check for greater and less than 50 or 100, etc. } } 

La dirección predeterminada es UISwipeGestureRecognizerDirectionRight. las direcciones múltiples también se pueden especificar así:

 [swipeGesture setDirection: UISwipeGestureRecognizerDirectionRight|UISwipeGestureRecognizerDirectionLeft]; 

/// Pero si quieres obtener todas las direcciones, así:

  UISwipeGestureRecognizer *swipeGestureR = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeGestureRight:)]; [swipeGestureR setDirection: UISwipeGestureRecognizerDirectionRight ]; [[[CCDirector sharedDirector] openGLView] addGestureRecognizer:swipeGestureR]; [swipeGestureR release]; UISwipeGestureRecognizer *swipeGestureL = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeGestureLeft:)]; [swipeGestureL setDirection: UISwipeGestureRecognizerDirectionLeft]; [[[CCDirector sharedDirector] openGLView] addGestureRecognizer:swipeGestureL]; [swipeGestureL release]; 

se llamará a la función handleSwipeGestureLeft cuando deslice hacia la izquierda, y se llamará a handleSwipeGestureRight cuando deslice hacia la derecha

Agregue un UISwipeGestureRecognizer para cada hacha (horizontal y vertical):

 UISwipeGestureRecognizer *horizontalSwipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(action)]; [horizontalSwipe setDirection:(UISwipeGestureRecognizerDirectionRight | UISwipeGestureRecognizerDirectionLeft )]; [self.view addGestureRecognizer:horizontalSwipe]; UISwipeGestureRecognizer *verticalSwipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(action)]; [verticalSwipe setDirection:(UISwipeGestureRecognizerDirectionUp | UISwipeGestureRecognizerDirectionDown )]; [self.view addGestureRecognizer:verticalSwipe]; 
 -(void)addGesture { UISwipeGestureRecognizer *swipeGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeGesture:)]; [self.view addGestureRecognizer:swipeGesture]; [swipeGesture release]; } -(void)handleSwipeGesture:(UISwipeGestureRecognizer *) sender { if (sender.direction == UISwipeGestureRecognizerDirectionUp) { //do something } else if (sender.direction == UISwipeGestureRecognizerDirectionDown) { //do something } else if (sender.direction == UISwipeGestureRecognizerDirectionLeft) { //do something } else if (sender.direction == UISwipeGestureRecognizerDirectionRight) { //do something } } 

También puede usar un interruptor en lugar de todas las declaraciones if

Aunque hay mucha información buena aquí, no pude encontrar una respuesta rápida que lo tuviera todo.

Si desea diferenciar si un deslizamiento es hacia la left o hacia la right o up o down , debe crear un nuevo UISwipeGestureRecognizer para cada dirección.

¡Sin embargo! Esto no es tan malo, ya que puede enrutar cada uno de sus reconocedores de gestos al mismo selector , que luego puede usar una instrucción de conmutación como es de esperar.

Primero , agregue los reconocedores de gestos para cada dirección y diríjalos al mismo selector:

 - (void)setupSwipeGestureRecognizers { UISwipeGestureRecognizer *rightSwipeGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(userDidSwipeScreen:)]; rightSwipeGestureRecognizer.direction = UISwipeGestureRecognizerDirectionRight; UISwipeGestureRecognizer *leftSwipeGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(userDidSwipeScreen:)]; leftSwipeGestureRecognizer.direction = UISwipeGestureRecognizerDirectionLeft; [self.view addGestureRecognizer:rightSwipeGestureRecognizer]; [self.view addGestureRecognizer:leftSwipeGestureRecognizer]; } 

En segundo lugar , diferenciar entre las instrucciones con una instrucción switch:

 - (void)userDidSwipeScreen:(UISwipeGestureRecognizer *)swipeGestureRecognizer { switch (swipeGestureRecognizer.direction) { case UISwipeGestureRecognizerDirectionLeft: { // Handle left break; } case UISwipeGestureRecognizerDirectionRight: { // Handle right break; } default: { break; } } }