Swift手势识别器,仅在连续手势中追踪第一次触摸

时间:2018-04-05 04:37:02

标签: ios swift uigesturerecognizer uipangesturerecognizer

我正在尝试使用手势识别器来允许用户通过用一根手指拖动来调整屏幕上的视图...因此,我想跟踪触摸的所有更改。我最初尝试使用PanGestureRecognizer,但是当用户用多个手指触摸视图时,我遇到了一个问题。我只想跟踪第一次触摸(即用户在手势中放置在屏幕上的第一根手指),但是我找不到一种方法来防止额外的触摸干扰我跟踪第一次触摸的能力。我最初的解决方案是简单地设置

recognizer.maximumNumberOfTouches = 1

但是,这会导致在第二次触摸时取消整个手势(在这种情况下我想继续跟踪第一次触摸)。但是,当然,不将此值设置为1会导致手势实际跟踪多个触摸。 如何制作手势识别器,仅跟踪手势中第一次触摸的所有更改,并且不会被屏幕上的其他触摸取消?

2 个答案:

答案 0 :(得分:-1)

这是一个UIGestureRecognizer子类,它将跟踪用户在手势开始时第一次触摸屏幕上的所有更改,并将忽略所有其他手指而不取消手势。请注意,如果您正在使用手势识别器的功能/属性(例如location(in:)),则可能还必须覆盖这些功能/属性。

class FirstTouchGestureRecognizer: UIGestureRecognizer {
    private var firstTouch: UITouch? = nil

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) {
        if firstTouch == nil {
            firstTouch = touches.first!
            self.state = .began
        }
    }

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent) {
        if firstTouch != nil && touches.contains(firstTouch!) {
            self.state = .changed
        }
    }

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent) {
        if firstTouch != nil && touches.contains(firstTouch!) {
            firstTouch = nil
            self.state = .ended
        }
    }
}

答案 1 :(得分:-1)

从您的评论和回答中,听起来您使用平移手势识别器始终是错误的,并且您在操作处理程序中做错了什么。平移手势识别器没有正确的动作处理程序可以使用location(in:)进行任何操作。 location(in:)为您提供了所有触摸的质心,这正是您所说的想要的 - 并且无论如何都不需要咨询它。

  • 如果您的目标是拖动视图,则使用translation(in:)

  • 如果您的目标是跟踪特定触摸的实际位置,请使用location(ofTouch:in:)

  • 如果您发现正在传递触摸并且您不想跟踪它,请致电ignore(_:for:)