l30c0d35
l30c0d35

Reputation: 807

Two UIGestureRecognizer on one view?

I am using spriteKit. I don't kwon whether this is important. I've initialized two UIGestureRecognizer to my view in didMove(toView):

let longPress = UILongPressGestureRecognizer()
longPress.minimumPressDuration = CFTimeInterval(0.0)
longPress.addTarget(self, action: #selector(self.longPressGesture(longpressGest:)))
self.view?.addGestureRecognizer(longPress)

let swipeUp = UISwipeGestureRecognizer()
swipeUp.direction = UISwipeGestureRecognizerDirection.up
swipeUp.addTarget(self, action: #selector(self.swipeUpGesture(swipe:)))
self.view?.addGestureRecognizer(swipeUp)

My Problem is that only the first gestureRecognizer is called (longpressGest). When I delete the first GestureRecognizer, the swipeGestureRecognizer does work. How can I solve this?

Upvotes: 0

Views: 1742

Answers (3)

user10571712
user10571712

Reputation:

You could also use the same gesture recognizer and differ between the two gesture inside of this function

Upvotes: 0

Leo Dabus
Leo Dabus

Reputation: 236350

You need to make your Game Scene view the delegate of your gesture recognizer. You will also need implement its method shouldRecognizeSimultaneouslyWith as mentioned by xmasRights:

So in your Game scene declaration just add UIGestureRecognizerDelegate:

class GameScene: SKScene, SKPhysicsContactDelegate, UIGestureRecognizerDelegate {

And in your didMove(to view: SKView) method make set its delegate:

let longPress = UILongPressGestureRecognizer()
longPress.delegate = self
longPress.minimumPressDuration = 0
longPress.addTarget(self, action: #selector(longPressGesture))
view.addGestureRecognizer(longPress)

let swipeUp = UISwipeGestureRecognizer()
swipeUp.delegate = self
swipeUp.direction = .up
swipeUp.addTarget(self, action: #selector(swipeUpGesture))
view.addGestureRecognizer(swipeUp)

Also In Swift 4 you will need to add @objc to your methods

@objc func longPressGesture(_ longPress: UILongPressGestureRecognizer) {
    print("longPressGesture")
}

@objc func swipeUpGesture(_ swipeUp: UISwipeGestureRecognizer) {
    print("swipeUpGesture")
}

Don't forget also to add the method shouldRecognizeSimultaneouslyWith as already mentioned by xmasRights:

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    print("shouldRecognizeSimultaneouslyWith")
    return true
}

Upvotes: 2

XmasRights
XmasRights

Reputation: 1509

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool 
{
    return true
}

https://developer.apple.com/documentation/uikit/touches_presses_and_gestures/coordinating_multiple_gesture_recognizers/allowing_the_simultaneous_recognition_of_multiple_gestures

Upvotes: 1

Related Questions