【问题标题】:Gesture recognizer with delaysTouchesBegan stops all calls to touchesMoved?具有延迟TouchesBegan 的手势识别器停止所有对touchesMoved 的调用?
【发布时间】:2018-04-07 20:35:26
【问题描述】:

下面的视图控制器代码演示了我的问题。它会打印一些调试语句以响应触摸事件和捏合手势。

如果手势识别器被禁用,并且我在屏幕上拖动手指,一切都会按预期进行:控制器会得到一个touchesBegan、一堆touchesMoved 和一个touchesEnded。但是,如果我启用手势识别器并将其delaysTouchesBegan 属性设置为true,并拖动一个手指,控制器将只接收touchesBegan 和touchesEnded 调用——没有touchesMoved。

delaysTouchesBegan 的文档建议触摸事件会在手势识别器失败后堆积并传递。这是预期的行为 - 丢失所有 touchesMoved 事件吗?

class ViewController: UIViewController {

    var gr: UIPinchGestureRecognizer!

    override func viewDidLoad() {
        super.viewDidLoad()
        gr = UIPinchGestureRecognizer(target: self, action: #selector(pinched(_:)))
        gr.delaysTouchesBegan = true
        view.addGestureRecognizer(gr)
    }

    @IBAction func buttonTapped(_ sender: Any) {
        gr.isEnabled = !gr.isEnabled
        print("pinch recognizer enabled: \(gr.isEnabled)")
    }

    @objc func pinched(_ gr: Any?) {
        print("pinched")
    }

    var i = 0

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        i = 0
        print("touchesBegan")
    }

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        print("touchesMoved \(i)")
        i += 1
    }

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        print("touchesEnded")
    }

    override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
        print("touchesCancelled")
    }
}

【问题讨论】:

    标签: ios uigesturerecognizer ios11 touchesmoved


    【解决方案1】:

    每次手指之间的距离发生变化时,捏合手势识别器都会报告变化。手指之间的距离被报告为比例因子。因此,您需要查看比例因子,而不是 touchesMoved。这有帮助吗?

    @objc func pinched(_ gr: UIPinchGestureRecognizer) {
    
        if gr.state == .began  {
            print("began")
        }
    
        if gr.state == .changed {
            print("scale: \(gr.scale)")
        }
    
        if gr.state == .ended {
            print("ended")
        }
    }
    

    Handling Pinch Gestures

    Handling Pinch Gestures ( Swift 4 - 2018 )

    【讨论】:

    • 我说的是我拖动单个手指的情况,因此捏合手势识别器不会触发。我希望为那个单指获得 touchesMoved(但延迟了)。我将在我的问题中添加 single 一词以使这一点更清楚。
    • 也许您可以使用平移手势识别器,然后您可以跟踪用户手指的移动,并且捏合手势识别器不会触发,并且在平移手势识别器不触发的情况下使用捏合手势识别器。
    • 我正在编写一个绘图/绘画程序,它需要来自手指或手写笔的所有 touchesMoved 事件。
    猜你喜欢
    • 2013-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-26
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多