【问题标题】:UIPanGestureRecognizer Swift Capture relative translationUIPanGestureRecognizer Swift Capture 相对翻译
【发布时间】:2020-04-07 16:48:25
【问题描述】:

我需要捕捉相对平移,我只处理x方向

假设我在一个方向上从右向左滑动(例如:-13.XXXX 到 -68.XXXX),然后我不抬起手指就从左向右滑动(例如:-68.XXXX 到 +30。 XXXX) 我如何捕捉到特定点翻译发生了变化 我正在尝试使用在开始和方向改变时最终为 0 的速度。

【问题讨论】:

  • 欢迎来到stackoverflow。当速度为 0 时保存平移。那么相对翻译将是翻译减去保存的翻译。这里唯一的问题是:速度是否总是在方向改变时变为零?可能不会。
  • 这还不完全清楚。您是否试图检测方向何时改变?只要保持之前的速度,看看当前速度的符号是否不同。顺便说一句,当你改变方向时,我不会假设你会看到 x 速度为零的事件。当您从向左滑动切换到向右滑动时,您可能只会看到速度从负数变为正数,但从来没有看到精确的速度为零。即使您确实看到速度为零,也无法保证您确实改变了方向而不是只是暂停。
  • @SteveO'Connor 是的,确实如此。当用户缓慢改变方向时,速度变为零
  • @Rob 感谢 Rob,改变了方向与只是暂停我没有考虑过这种情况,你说得对。我认为与其依赖于速度,我应该只依赖于翻译并实施史蒂夫解决方案,或者我需要检查速度标志,利用这个。

标签: swift


【解决方案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
    }
}

请注意,您不能依赖零速度测试,因为通常当您从向左平移到向右平移(反之亦然)时,它可能会从一个方向移动到另一个方向,而不会遇到精确为零的速度。您可能偶尔会出现,但通常不会。

【讨论】:

    猜你喜欢
    • 2017-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多