将 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
}
问题
此技术在向左拖动时效果很好,但在向右拖动时效果不佳。
情况如下:
- 向左拖动时,打印几行"dragging left"
- 向右拖动时,打印如下:
- "dragging left"
"dragging right"
"dragging left"
"dragging right"
...
现在,我认为向左拖动有效,因为向左拖动的代码块在在向右拖动的代码块之后执行。因此,当删除第二个代码块时,向右拖动按预期工作。
问题
我怎样才能更好地将最后一个 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
就是这样!
背景
我想在视图从左向右拖动时为它设置动画,反之亦然。为了确定它被拖向哪个方向,我跟踪它所在的最后一个 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
}
问题
此技术在向左拖动时效果很好,但在向右拖动时效果不佳。
情况如下:
- 向左拖动时,打印几行"dragging left"
- 向右拖动时,打印如下:
- "dragging left"
"dragging right"
"dragging left"
"dragging right"
...
- "dragging left"
现在,我认为向左拖动有效,因为向左拖动的代码块在在向右拖动的代码块之后执行。因此,当删除第二个代码块时,向右拖动按预期工作。
问题
我怎样才能更好地将最后一个 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
就是这样!