Detect when UIGestureRecognizer is up, down, left and right Cocos2d Detect when UIGestureRecognizer is up, down, left and right Cocos2d xcode xcode

Detect when UIGestureRecognizer is up, down, left and right Cocos2d


Apparently each UISwipeGestureRecognizer can only detect the swipe in the given direction. Even though the direction flags could be OR'ed together the UISwipeGestureRecognizer ignores the additional flags.

The solution is to add one UISwipeGestureRecognizer for each direction you want the swipe gesture to be recognized, and set each recognizer's direction accordingly to either up, down, left and right. If you want to test for a swipe in any direction you'll have to add four UISwipeGestureRecognizers.

It's kind of odd but that's the only way it worked for 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}orUISwipeGestureRecognizer *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 a UIPanGestureRecogizer and detect the swipe directions you care about. see the UIPanGestureRecognizer documentation for details. -rrh

// add pan recognizer to the view when initializedUIPanGestureRecognizer *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 (i.e. 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.    }}