Swift LongPress在.Ended时触发Tap(启用了Simultaneous Gestures但是......)

时间:2016-04-15 20:56:59

标签: swift sprite-kit

它只能在持有长按的前2秒内完成。它表现得非常奇怪(无论如何)。让我试着解释......

当您按下屏幕左侧或右侧的长按时,它会按照您推动的方向启动播放器“正在运行”。当你放松时,他会停止跑步。这很好用。

当你静止不动时,如果点击,它会记录水龙头。如果你滑动,它会注册滑动(所有方向)。这很好用。

一旦你跑步就会出现问题。它像这样分解:

你开始跑了。如果你在第一个大约2秒内做任何其他输入,它会忽略初始手势。所以,如果你点击,它会忽略它。如果你等了2秒,它会看到初始手势就好了。但是......如果你立即点击(忽略它),然后点击(或滑动,任一种手势方法都可以实现这一点),它将在2秒钟内注册第二次点击/滑动。

所以SOMETHING是在你开始长按之后的第一秒内发生的,它只是忽略第一次按下直到~2秒标记。我搜索了一个关于持续时间或偏移的设置,但我太新了,所以我真的不知道该搜索什么。

我的手势识别器的代码:

    // swipe up
    let swipeUp:UISwipeGestureRecognizer = UISwipeGestureRecognizer(target: self, action: #selector(GameScene.handleSwipe(_:)))
    swipeUp.direction = .Up
    swipeUp.delegate = self
    view.addGestureRecognizer(swipeUp)
    // swipe dn
    let swipeDn:UISwipeGestureRecognizer = UISwipeGestureRecognizer(target: self, action: #selector(GameScene.handleSwipe(_:)))
    swipeDn.direction = .Down
    swipeDn.delegate = self
    view.addGestureRecognizer(swipeDn)
    // swipe rt
    let swipeRt:UISwipeGestureRecognizer = UISwipeGestureRecognizer(target: self, action: #selector(GameScene.handleSwipe(_:)))
    swipeRt.direction = .Right
    swipeRt.delegate = self
    view.addGestureRecognizer(swipeRt)
    // swipe lt
    let swipeLt:UISwipeGestureRecognizer = UISwipeGestureRecognizer(target: self, action: #selector(GameScene.handleSwipe(_:)))
    swipeLt.direction = .Left
    swipeLt.delegate = self
    view.addGestureRecognizer(swipeLt)
    // tap
    let tapped:UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(GameScene.handleTap(_:)))
    tapped.delegate = self
    tapped.cancelsTouchesInView = true
    view.addGestureRecognizer(tapped)
    // long press
    let pressed:UILongPressGestureRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(GameScene.handlePress(_:)))
    pressed.minimumPressDuration = 0.1
    pressed.cancelsTouchesInView = false
    pressed.delegate = self
    view.addGestureRecognizer(pressed)

处理手势的功能:

// multiple gestures
func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    if gestureRecognizer is UITapGestureRecognizer || gestureRecognizer is UISwipeGestureRecognizer || gestureRecognizer is UILongPressGestureRecognizer {
        return true
    } else {
        return false
    }
}

// taps
func handleTap(sender: UITapGestureRecognizer) {
    if sender.state == .Ended {
        print("tap ended")
    }
}
// swipes
func handleSwipe(sender: UISwipeGestureRecognizer) {
    switch sender.direction {
    case UISwipeGestureRecognizerDirection.Right:
        print("swipe RIGHT")
    case UISwipeGestureRecognizerDirection.Left:
        print("swipe LEFT")
    case UISwipeGestureRecognizerDirection.Up:
        print("swipe UP")
    case UISwipeGestureRecognizerDirection.Down:
        print("swipe DOWN")
    default:
        break
    }
}
// longPresses
func handlePress(sender: UILongPressGestureRecognizer) {
    if sender.state == .Began {
        theWAY()
    }
    if sender.state == .Ended {
        player.runAction(animIdle)
        moving = false
    }
}

该函数theWay()只是处理移动的代码,并且其中没有与手势识别相关的任何内容。与变量移动相同。

我在做一些明显不对的错吗?我是新手,所以我假设我的代码中有一些明显的错误,因为这是令人困惑的。我试过切换东西并使用touchesBegan / touchesEnded函数,但它没有帮助。它只会让事情变得更加混乱。

帮助我过度流动 - 肯诺比......你是我唯一的希望。

0 个答案:

没有答案