在TouchesMoved

时间:2017-04-10 11:05:38

标签: ios swift touchesmoved

背景

我希望在从左到右拖动视图时为其设置动画,反之亦然。为了确定它被拖动的方向,我将跟踪它所处的最后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位置与当前位置进行比较,以确保只执行正确的代码块?

注意

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

1 个答案:

答案 0 :(得分:0)

我意识到它与我在代码块中执行的代码有关:我改变了视图的大小。显然,每当我更新大小时它就会“反弹”并产生这个错误。

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

所以,我更换了这个:

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

就是这样!