【问题标题】:UIPanGestureRecognizer detect non-movement/stillnessUIPanGestureRecognizer 检测非移动/静止
【发布时间】:2021-08-19 23:25:06
【问题描述】:

我正在使用 UIPanGestureRecognizer 来跟踪手指的运动。用户最初可能会非常快速地平移,但随后可能会在屏幕上的某个点保持几秒钟左右而不松开手指。我想检测这种过早的“拖动结束”事件何时发生。我尝试使用速度检测这一点,但它并不总是可靠的。

       let location = panGesture.location(in: selectedCell.superview)
        
        let velocity = panGesture.velocity(in: selectedCell.superview)
        NSLog("Velocity, \(velocity)")
        
        switch panGesture.state {
        case .began:
            break
            
        case .changed:
            let delta = panGesture.translation(in: self)
            
            if velocity.x <= 0.05 && velocity.y <= 0.05 {
                NSLog("Velocity 0!!!!")
            }
            panGesture.setTranslation(.zero, in: self)
            break

【问题讨论】:

    标签: ios uiview uikit uipangesturerecognizer


    【解决方案1】:

    如果用户根本没有移动手指,则不会触发该事件。这是一个解决方法 -

    一旦您知道gesture.state == .began,添加一个计时器以每0.1s触发一次,以检查自上次已知点以来的翻译内容。

    即使用户静止不动,您也可以每 0.1s 可靠地检查平移和速度。

    不要忘记在.cancelled.ended.failed 状态下致电timer.invalidate()

    【讨论】:

    • 我尝试了计时器,但问题是速度是 (2.0, 0.0) 或 (10.0, 0.0),即使我没有移动。它不是 (0.0, 0.0)。我想知道有没有一种可靠的方法来捕捉速度。另外我正在将 .changed 中的翻译重置为 0,所以我不确定在计时器块中检查翻译是否可靠。
    • 您需要为var lastKnownPoint: CGPoint 提供单独的存储空间,除了 .began 块之外,您不应在任何地方重置。现在,即使您将panGesture 的翻译重置为零,它也不会影响您的存储。在计时器块中,您可以使用距离公式 - sqrt(pow(x1-x2, 2) + pow(y1-y2, 2)) 计算 panGesturelastKnownPointcurrentLocation 之间的距离。
    • 是的,如果用户不移动手指,velocityInview 似乎不会更新。
    猜你喜欢
    • 2018-10-27
    • 2011-12-03
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多