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

Compare last position to current in 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 位置与当前位置进行比较,以确保只执行正确的代码块?

备注

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

我意识到它与我在代码块中执行的代码有关:我改变了视图的大小。显然,它 "bounces back" 每次我更新尺寸时都会产生这个错误。

要解决这个问题,我所要做的就是使用触摸的位置而不是被拖动的视图来计算,因为触摸的位置不会因改变视图的大小而受到影响。

所以,我替换了这个:

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

就是这样!