一个视图上有两个 UIGestureRecognizer?

Two UIGestureRecognizer on one view?

我正在使用 spriteKit。我不知道这是否重要。我已经在 didMove(toView):

中为我的视图初始化了两个 UIGestureRecognizer
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)

我的问题是只调用了第一个 gestureRecognizer (longpressGest)。当我删除第一个 GestureRecognizer 时,swipeGestureRecognizer 会起作用。我该如何解决?

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

您需要让您的游戏场景查看手势识别器的委托。您还需要实现 xmasRights 提到的方法 shouldRecognizeSimultaneouslyWith:

所以在你的游戏场景声明中只需添加 UIGestureRecognizerDelegate:

class GameScene: SKScene, SKPhysicsContactDelegate, UIGestureRecognizerDelegate {

然后在您的 didMove(to view: SKView) 方法中设置其委托:

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)

此外,在 Swift 4 中,您需要将 @objc 添加到您的方法中

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

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

别忘了添加 xmasRights 已经提到的方法 shouldRecognizeSimultaneouslyWith:

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

您也可以使用相同的手势识别器,并在此函数中区分两个手势