UIPanGestureRecognizer Swift Capture 相对翻译
Posted
技术标签:
【中文标题】UIPanGestureRecognizer Swift Capture 相对翻译【英文标题】:UIPanGestureRecognizer Swift Capture relative translation 【发布时间】:2020-04-07 16:48:25 【问题描述】:我需要捕捉相对平移,我只处理x方向
假设我在一个方向上从右向左滑动(例如:-13.XXXX 到 -68.XXXX),然后我不抬起手指就从左向右滑动(例如:-68.XXXX 到 +30。 XXXX) 我如何捕捉到特定点翻译发生了变化 我正在尝试使用在开始和方向改变时最终为 0 的速度。
【问题讨论】:
欢迎来到***。当速度为 0 时保存平移。那么相对翻译将是翻译减去保存的翻译。这里唯一的问题是:速度是否总是在方向改变时变为零?可能不会。 这还不完全清楚。您是否试图检测方向何时改变?只要保持之前的速度,看看当前速度的符号是否不同。顺便说一句,当你改变方向时,我不会假设你会看到 x 速度为零的事件。当您从向左滑动切换到向右滑动时,您可能只会看到速度从负数变为正数,但从来没有看到精确的速度为零。即使您确实看到速度为零,也无法保证您确实改变了方向而不是只是暂停。 @SteveO'Connor 是的,确实如此。当用户缓慢改变方向时,速度变为零 @Rob 感谢 Rob,改变了方向与只是暂停我没有考虑过这种情况,你说得对。我认为与其依赖于速度,我应该只依赖于翻译并实施史蒂夫解决方案,或者我需要检查速度标志,利用这个。 【参考方案1】:我建议根据速度计算方向:
enum Direction
case left
case right
extension Direction
static func direction(from velocity: CGFloat) -> Direction?
if velocity < 0
return .left
else if velocity > 0
return .right
else
return nil
然后,跟踪之前的方向并检测方向的变化:
var previousDirection: Direction?
@objc func handlePan(_ gesture: UIPanGestureRecognizer)
let velocity = gesture.velocity(in: gesture.view).x
guard let direction = Direction.direction(from: velocity) else return
if direction != previousDirection
if previousDirection == nil
print("starting", direction)
else
print("changing direction to", direction)
previousDirection = direction
请注意,您不能依赖零速度测试,因为通常当您从向左平移到向右平移(反之亦然)时,它可能会从一个方向移动到另一个方向,而不会遇到精确为零的速度。您可能偶尔会出现,但通常不会。
【讨论】:
以上是关于UIPanGestureRecognizer Swift Capture 相对翻译的主要内容,如果未能解决你的问题,请参考以下文章
如何在父视图中限制 UIPanGestureRecognizer
未调用 iOS 13 UIPanGestureRecognizer 选择器
Swift:获取 UIPanGestureRecognizer 的目标