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

UIPanGestureRecognizer 干扰滚动

未调用 iOS 13 UIPanGestureRecognizer 选择器

Swift:获取 UIPanGestureRecognizer 的目标

当对象移动到某个帧时如何停止 UIPanGestureRecognizer

在父 UIView 中移动 UIView (UIPanGestureRecognizer)