UIPanGestureRecognizer 检测 non-movement/stillness

UIPanGestureRecognizer detect non-movement/stillness

我正在使用 UIPanGestureRecognizer 来跟踪手指的移动。用户最初可能会非常快速地平移,但随后可能会在屏幕上的某个点上停留几秒钟左右而不松开手指。我想检测这种过早的 'end of dragging' 事件。我试着用速度检测这个,但它并不总是可靠的。

       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

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

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

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

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