Rileva quando UIGestureRecognizer è su, giù, a sinistra ea destra Cocos2d

Ho un CCSprite che voglio spostarmi usando i gesti. Il problema è che sono completamente nuovo a Cocos2D. Voglio che il mio sprite esegua un’azione quando il gesto è attivo, un altro quando il gesto è abbassato, un’altra azione quando il gesto è giusto e la stessa cosa per sinistra. Qualcuno può indicarmi la giusta direzione?

Grazie!

Apparentemente, ogni UISwipeGestureRecognizer può rilevare lo scorrimento nella direzione indicata. Anche se i flag di direzione possono essere OR insieme, UISwipeGestureRecognizer ignora i flag aggiuntivi.

La soluzione consiste nell’aggiungere un UISwipeGestureRecognizer per ciascuna direzione in cui si desidera venga riconosciuto il gesto di scorrimento e impostare la direzione di ciascun riconoscitore in base a su, giù, sinistra e destra. Se si desidera eseguire il test di un passaggio in qualsiasi direzione, è necessario aggiungere quattro UISwipeGestureRecognizers.

È un po ‘strano, ma è l’unico modo in cui ha funzionato per me.

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) { } } 

Usa un UIPanGestureRecogizer e individua le direzioni di scorrimento che ti interessano. consultare la documentazione di UIPanGestureRecognizer per i dettagli. -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 direzione di defaut è UISwipeGestureRecognizerDirectionRight. anche le molteplici direzioni possono essere specificate in questo modo:

 [swipeGesture setDirection: UISwipeGestureRecognizerDirectionRight|UISwipeGestureRecognizerDirectionLeft]; 

/// Ma se vuoi ottenere ogni singola direzione, in questo modo:

  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]; 

la funzione handleSwipeGestureLeft verrà chiamata quando scorri verso sinistra e mantieni SwipeGestureRight da chiamare quando scorri verso destra

Aggiungi un UISwipeGestureRecognizer per ogni ascia (orizzontale e verticale):

 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 } } 

Può anche usare un interruttore invece di tutte le istruzioni if

Anche se qui ci sono molte buone informazioni, non sono riuscito a trovare una risposta rapida che avesse tutto.

Se si desidera distinguere se uno scorrimento è a left o a right o up o down , è necessario creare un nuovo UISwipeGestureRecognizer per ciascuna direzione.

Però! Non è così male, perché puoi indirizzare ognuno dei tuoi riconoscitori di gesti allo stesso selettore , che può quindi utilizzare un’istruzione switch come ci si potrebbe aspettare.

Innanzitutto , aggiungi i riconoscitori di gesti per ciascuna direzione e indirizzali allo stesso selettore:

 - (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]; } 

In secondo luogo , differenziare le direzioni con un’istruzione switch:

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