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()
。
我正在使用 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()
。