25

i need to detect direction of my swipe gesture and i've got problem with it. gesture is working, but i don't know how to detect direction. ...

swipeGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(detectSwipe:)];
[swipeGesture setNumberOfTouchesRequired:1];
[swipeGesture setDirection:UISwipeGestureRecognizerDirectionDown | UISwipeGestureRecognizerDirectionUp];
[appView addGestureRecognizer:swipeGesture];

-(void)detectSwipe:(UISwipeGestureRecognizer *)recognizer { 
switch (recognizer.direction) {
    case UISwipeGestureRecognizerDirectionUp:
        NSLog(@"smth1");
        break;


    case UISwipeGestureRecognizerDirectionDown:
        NSLog(@"smth2");
    default:
        break;
}
}

it's not working :/

Tomasz Szulc
  • 4,217
  • 4
  • 43
  • 79
  • Please define "it's not working." Does the log the incorrect value? Does it not log anything? Is detectSwipe not being called? – sosborn Jan 11 '12 at 01:34
  • `default` case is called when i swipe to up or to down. – Tomasz Szulc Jan 11 '12 at 01:36
  • Since it's just an enum - have you tried to cast and log the value of the recognizer: http://developer.apple.com/library/IOs/#documentation/UIKit/Reference/UISwipeGestureRecognizer_Class/Reference/Reference.html – bryanmac Jan 11 '12 at 01:46

4 Answers4

51

Here is an example from one of my projects:

    // ...

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

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

    UISwipeGestureRecognizer *swipeUp = [[UISwipeGestureRecognizer alloc]  initWithTarget:self action:@selector(didSwipe:)];
    swipeUp.direction = UISwipeGestureRecognizerDirectionUp;
    [self.view addGestureRecognizer:swipeUp];

    UISwipeGestureRecognizer *swipeDown = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(didSwipe:)];
    swipeDown.direction = UISwipeGestureRecognizerDirectionDown;
    [self.view addGestureRecognizer:swipeDown];

    // ...

- (void)didSwipe:(UISwipeGestureRecognizer*)swipe{

    if (swipe.direction == UISwipeGestureRecognizerDirectionLeft) {
        NSLog(@"Swipe Left");
    } else if (swipe.direction == UISwipeGestureRecognizerDirectionRight) {
        NSLog(@"Swipe Right");
    } else if (swipe.direction == UISwipeGestureRecognizerDirectionUp) {
        NSLog(@"Swipe Up");
    } else if (swipe.direction == UISwipeGestureRecognizerDirectionDown) {
        NSLog(@"Swipe Down");
    }
}
nemelianov
  • 911
  • 1
  • 7
  • 15
  • I think you don't need to add 4 gesture recognizer, just add one and in the didSwipe method check the sender's swipe direction, that should do it – Sumit Kumar Saha Jan 16 '18 at 14:33
20

The direction property only defines the allowed directions that are recognized as swipes, not the actual direction of a particular swipe.

The easiest would be to use two separate gesture recognizers instead. You could also inspect the location of the touch when the gesture starts and when it ends with the locationInView: method.

omz
  • 53,243
  • 5
  • 129
  • 141
  • `CGPoint start = [swipeGesture locationInView:appView];` i use this and this function give me start point of swipe, but how i detect when swipe is ended? only way is to use `touchesBegan` and `touchesEnded`? – Tomasz Szulc Jan 11 '12 at 07:32
  • 2
    I'm not sure if this is actually possible (you're probably better off with two recognizers). Check the `state` of the gesture recognizer in your action. For most gesture recognizers, it transitions from `UIGestureRecognizerStateBegan` to `UIGestureRecognizerStateEnded`, but it could be that the swipe gesture recognizer type doesn't do that, I haven't tried it. – omz Jan 11 '12 at 07:38
17

Extending omz's solution:

self.myView is the view I want to put the gesture recognizer on. The code below is not tested, I guess it would be better to keep the recognizers as propertys and add them inside viewDidLoad() or xib file. self is a UIViewController.

UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipedLeft:)];
[swipeLeft setDirection:UISwipeGestureRecognizerDirectionLeft ];
[self.view addGestureRecognizer:swipeLeft];

UISwipeGestureRecognizer *swipeRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipedRight:)];
[swipeRight setDirection:UISwipeGestureRecognizerDirectionRight ];
[self.view addGestureRecognizer:swipeRight];

Add those two methods to your UIViewController and add necessary actions:

- (IBAction)swipedRight:(UISwipeGestureRecognizer *)recognizer
{
    NSLog(@"swiped right");
}

- (IBAction)swipedLeft:(UISwipeGestureRecognizer *)recognizer
{
    NSLog(@"swiped left");
} 
Yunus Nedim Mehel
  • 12,089
  • 4
  • 50
  • 56
0

Swipe Gesture direction detect with Swift 5

    override func viewDidLoad() {
    super.viewDidLoad()

         let leftSwipe = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipes(_:)))
         let rightSwipe = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipes(_:)))

         leftSwipe.direction = .left
         rightSwipe.direction = .right

         view.addGestureRecognizer(leftSwipe)
         view.addGestureRecognizer(rightSwipe)
    }

    @objc func handleSwipes(_ sender:UISwipeGestureRecognizer) {

        if (sender.direction == .left) {
                print("Swipe Left")
        }

        if (sender.direction == .right) {
            print("Swipe Right")
        }
    }
Raj Joshi
  • 2,669
  • 2
  • 30
  • 37