我希望在从左到右拖动视图时为其设置动画,反之亦然。为了确定它被拖动的方向,我将跟踪它所处的最后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位置与当前位置进行比较,以确保只执行正确的代码块?
我意识到它与我在代码块中执行的代码有关:我改变了视图的大小。显然,每次更新大小时它都会“反弹”并产生这个错误 要解决这个问题,我所要做的就是使用触摸的位置而不是被拖动的视图进行计算,因为改变视图的大小不会影响触摸的位置。
答案 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
就是这样!