Antonia Zhang
Antonia Zhang

Reputation: 103

Swift, swipe gesture recognizer direction doesn’t work, can’t seem to get the direction

Edit: it seems the swipe gesture can only takes one direction a time now. If someone knows another way to handle multiple directions at once, I’d still appreciate information!

Eidt: I find a way to deal with multiple directions concisely in this [answer] (https://stackoverflow.com/a/46104997/9645644) It uses an array literal with forEach loop. It’s much more convenient than adding gestures and dragging actions separately from storyboard.

I’m trying to get swift swipe gestures to work, everything’s fine until I tried to detect the direction of the swipe. Below is my code. I don’t understand why this isn’t working and would appreciate help!

In a view controller’s viewDidLoad I set up and added the swipe gesture recognizer, with direction[.left, .right]. After that I implemented the handler method which needs to detect the direction of the swipe. There’s no other stuff in this view controller. After it failed to work(no response when swipe), I added a few prints, and got the output in the title.

override func viewDidLoad() {
    super.viewDidLoad()
    let swipeGestureRecognizer = UISwipeGestureRecognizer(target:self, action:#selector(swipeHandler(recognizer: )))
    swipeGestureRecognizer.direction = [.left, .right]
    view.addGestureRecognizer(swipeGestureRecognizer)
}

@objc func swipeHandler (recognizer: UISwipeGestureRecognizer){
    switch recognizer.state{
    case .ended:
        let direction = recognizer.direction
        print(direction)
        if direction == .left {print(”left”)}
        else if direction == .right {print(“right”)}
        else {print(print(“none”)}
    defaul: break
}

No matter left or right I swipe, it always prints “none”. And the direction print always give a “UISwipeGestureRecognizerDirection(rawValue: 3)”

Upvotes: 0

Views: 1823

Answers (2)

Alain Cruz
Alain Cruz

Reputation: 5097

You need to detect one direction at a time. I would also suggest to add a method to control each swipe direction. For example.

func setUpGestures() {
    // Gesture that define a left swipe.
    let swipeLeft = UISwipeGestureRecognizer(target: self, action: #selector(Scene.swipeLeft))
    swipeLeft.direction = .left
    view?.addGestureRecognizer(swipeLeft)
    // Do the same for the rest of the directions.
}

@objc func swipeLeft() {
    // Do something when the user swipe left.
}

Hope it helps!

Upvotes: 0

giorashc
giorashc

Reputation: 13713

The direction property tells the gesture when to trigger. for example if direction == .right then the swipe will trigger only on a swipe to the right. (It does not tell you the direction detected)

Upvotes: 1

Related Questions