gpt4 book ai didi

ios - 将 TouchesMoved 中的最后位置与当前位置进行比较

转载 作者:行者123 更新时间:2023-11-28 08:12:43 25 4
gpt4 key购买 nike

背景

我想在 View 从左向右拖动时为其设置动画,反之亦然。为了确定它被拖向哪个方向,我跟踪它所在的最后一个 x 位置,然后将其与当前位置进行比较。

代码

var lastX: CGFloat = 0
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
let currentX = (((touches.first as AnyObject) as! UITouch).view?.center ?? CGPoint.zero).x
if lastX == 0 { lastX = currentX; return }

if currentX > self.lastX {
print("dragging right")
//altering the view's size based on progress made dragging
} else if currentX < self.lastX {
print("dragging left")
//altering the view's size based on progress made dragging
}
lastX = currentX
}

问题

此技术在向左拖动时效果很好,但在向右拖动时效果不佳。

这是发生了什么:

  • 向左拖动时,打印几行“向左拖动”
  • 向右拖动时,它会打印:
    • “向左拖动”
      “向右拖动”
      “向左拖动”
      “向右拖动”
      ...

现在,我认为向左拖动是有效的,因为用于向左拖动的代码块是在用于向右拖动的代码块之后执行的。因此,当删除第二个代码块时,向右拖动会按预期工作。

问题

我怎样才能更好地将最后一个 x 位置与当前位置进行比较,以确保只执行正确的代码块?

注意事项

我意识到它与我在代码块中执行的代码有关:我改变了 View 的大小。显然,每次我更新尺寸时它都会“反弹”,这会产生此错误。
要解决此问题,我所要做的就是使用触摸的位置进行计算,而不是使用正在拖动的 View ,因为触摸的位置不会因更改 View 的大小而受到影响。

最佳答案

我意识到它与我在代码块中执行的代码有关:我改变了 View 的大小。显然,每次我更新尺寸时它都会“反弹”,这会产生此错误。

要解决此问题,我所要做的就是使用触摸的位置进行计算,而不是使用正在拖动的 View ,因为触摸的位置不会因更改 View 的大小而受到影响。

所以,我替换了这个:

let currentX = (((touches.first as AnyObject) as! UITouch).view?.center ?? CGPoint.zero).x

用这个:

let currentX = ((touches.first as AnyObject) as! UITouch).location(in: self.superview).x

就是这样!

关于ios - 将 TouchesMoved 中的最后位置与当前位置进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43321532/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com