how detect swipe gesture direction?
Asked Answered
S

4

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 :/

Synchro answered 11/1, 2012 at 1:28 Comment(3)
Please define "it's not working." Does the log the incorrect value? Does it not log anything? Is detectSwipe not being called?Gallinaceous
default case is called when i swipe to up or to down.Synchro
Since it's just an enum - have you tried to cast and log the value of the recognizer: developer.apple.com/library/IOs/#documentation/UIKit/Reference/…Incardination
P
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.

Patois answered 11/1, 2012 at 1:55 Comment(2)
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?Synchro
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.Patois
M
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");
    }
}
Mealymouthed answered 27/1, 2014 at 9:47 Comment(1)
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 itCephalic
P
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.

Patois answered 11/1, 2012 at 1:55 Comment(2)
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?Synchro
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.Patois
A
18

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");
} 
Aluminiferous answered 29/5, 2013 at 9:25 Comment(0)
C
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")
        }
    }
Cassell answered 27/8, 2019 at 6:11 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.