识别器.location(in:recognizer.view) 快速返回零点

Posted

技术标签:

【中文标题】识别器.location(in:recognizer.view) 快速返回零点【英文标题】:recognizer.location(in: recognizer.view) returns point zero in swift 【发布时间】:2017-08-01 15:11:32 【问题描述】:

我对 Swift 中的 UIPanGestureRecognizer 有一个奇怪的案例。 我有一个处理平移手势的函数,并在 UIGestureRecognizerDelegate 中指定“false”,这样没有其他手势会干扰平移。

这是有问题的案例:

    用户用一根手指触摸并开始平移 用户将第二根手指放在屏幕上 - 第二根手指被忽略 用户抬起第一根手指,而第二根手指仍在触摸 - 此时我的处理程序被调用 recognizer.state == .ended。问题是此时的位置(我通过调用recognizer.location(in: recognizer.view) 得到,返回点(0,0)

我是否使用了错误的方法来理解这一点?似乎由于第二根手指被完全忽略了,第一根手指应该表现得像一个普通的平移,当状态==结束时我会得到位置。

【问题讨论】:

【参考方案1】:

我刚刚对其进行了测试 - 识别器结束时位置不再可用(使用以下方法)

  recognizer.location(ofTouch: 0, in: recognizer.view)

我会添加一个变量来跟踪 .began 和 .changed 中的最后一个已知点(我在其中获取数据)然后在 .ended 中使用该数据

编辑:通过子类化获取数据

class pgr: UIPanGestureRecognizer 
    var myTouch:Set<UITouch>!

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent) 
        myTouch = touches
        super.touchesEnded(touches, with: event)
    


然后回到你的实现中

    if sender.state == .ended 
        print(sender.myTouch.first?.location(in: sender.view))
    

【讨论】:

是否有文件证明它们不可用?我用你所说的作为解决方法,但我想知道这是否是最佳做法 如果您检查 UIGestureRecognizer,正在讨论的两个是获取该信息的唯一方法(没有接触:我可以找到访问的 Set - 我认为属于 UIView。然而,可能有一种更巧妙的方法可以做到这一点,但我不知道。 UIView 将在其自己的覆盖函数 touchesEnded(_ touches: Set, with event: UIEvent?) 中为您提供信息,但如果另一个手势成功,它似乎不会被调用. 实际上,我正在查看一些代码 - 如果您将手势识别器子类化并覆盖 override func touchesEnded(_ touches: Set, with event: UIEvent) 它看起来应该可以工作,将对其进行测试并在一分钟内更新我的答案

以上是关于识别器.location(in:recognizer.view) 快速返回零点的主要内容,如果未能解决你的问题,请参考以下文章

UIKit Dynamics:识别圆形和边界

JS识别当前URL,延迟5秒后跳转到特定页面

JavaScript window.location.href 的问题 [重复]

如何在 Service 类中使用 Fused Location Provider?

请问PHP里的header('Location:xxx')函数跳转和JS里的location.href哪个能看到来路

BOM常见对象