停止 UIPanGestureRecognizer 超过阈值
Stop UIPanGestureRecognizer moving past threshold
我有一个手势是我的观点之一。手势不会让它向后移动并阻止它移动超过球门的中心。
如果用户将目标拖动到绿色一侧,它将停留在中心,但一旦他们开始向按钮拖回,它就会后退。即使用户手指不在 XButton 视图上方。
此处的代码示例:
let xGestureDrag = UIPanGestureRecognizer(target: self, action: #selector(AdViewPageVC.xButtonWasDragged(_:)))
@objc func xButtonWasDragged(_ sender: UIPanGestureRecognizer) {
if sender.state == UIGestureRecognizerState.began || sender.state == UIGestureRecognizerState.changed {
self.view.bringSubview(toFront: xButton)
let translation = sender.translation(in: self.view)
print(translation.x)
xButton.center = CGPoint(x: xButton.center.x + translation.x, y: xButton.center.y)
if xButton.center.x < startingPointxBtn {
xButton.center.x = startingPointxBtn
} else if xButton.center.x > largeCircle.center.x {
xButton.center.x = largeCircle.center.x
}
sender.setTranslation(CGPoint.zero, in: self.view)
} else if sender.state == UIGestureRecognizerState.ended {
if largeCircle.center.x - xButton.center.x <= 35.0 {
xButton.center = largeCircle.center
} else {
xButton.center.x = startingPointxBtn
}
}
}
视频示例:
我已经实施了一个答案。对于寻找此类行为的任何人,您可以找到我的解决方案。
当我们滑动视图时,我使用了一个变量来保存我们翻译的距离计数器。
使用它来做一些 if 检查,你会得到你需要的确切行为。
新行为的视频示例(拖过目标、落后于起点、快到起点和快到目标):
代码如下:
@objc func xButtonWasDragged(_ sender: UIPanGestureRecognizer) {
if sender.state == UIGestureRecognizerState.began || sender.state == UIGestureRecognizerState.changed {
self.view.bringSubview(toFront: xButton)
let translation = sender.translation(in: self.view)
//Move the view
xButton.center = CGPoint(x: xButton.center.x + translation.x, y: xButton.center.y)
distanceCounter += translation.x
//if moved left dont add to our distance counter
if distanceCounter < 0 {
distanceCounter = 0
}
// prevent button from moving left from start
if xButton.center.x < startingPointxBtn {
xButton.center.x = startingPointxBtn
} else if xButton.center.x > largeCircle.center.x && distanceCounter > xBtnDistance {
xButton.center.x = largeCircle.center.x
distanceCounter = xBtnDistance
// If we hit our target center and go over it in our distance counter
// make our distance be reached and forced to the center
} else {
// set the translation
sender.setTranslation(CGPoint.zero, in: self.view)
}
} else if sender.state == UIGestureRecognizerState.ended {
// If you let go of button within a distance, snap to center
if largeCircle.center.x - xButton.center.x <= 35.0 {
xButton.center = largeCircle.center
} else {
// if none of these conditions meet make it snap to start
xButton.center.x = startingPointxBtn
}
// reset our counter to always begin with zero
distanceCounter = 0
}
}
我有一个手势是我的观点之一。手势不会让它向后移动并阻止它移动超过球门的中心。
如果用户将目标拖动到绿色一侧,它将停留在中心,但一旦他们开始向按钮拖回,它就会后退。即使用户手指不在 XButton 视图上方。
此处的代码示例:
let xGestureDrag = UIPanGestureRecognizer(target: self, action: #selector(AdViewPageVC.xButtonWasDragged(_:)))
@objc func xButtonWasDragged(_ sender: UIPanGestureRecognizer) {
if sender.state == UIGestureRecognizerState.began || sender.state == UIGestureRecognizerState.changed {
self.view.bringSubview(toFront: xButton)
let translation = sender.translation(in: self.view)
print(translation.x)
xButton.center = CGPoint(x: xButton.center.x + translation.x, y: xButton.center.y)
if xButton.center.x < startingPointxBtn {
xButton.center.x = startingPointxBtn
} else if xButton.center.x > largeCircle.center.x {
xButton.center.x = largeCircle.center.x
}
sender.setTranslation(CGPoint.zero, in: self.view)
} else if sender.state == UIGestureRecognizerState.ended {
if largeCircle.center.x - xButton.center.x <= 35.0 {
xButton.center = largeCircle.center
} else {
xButton.center.x = startingPointxBtn
}
}
}
视频示例:
我已经实施了一个答案。对于寻找此类行为的任何人,您可以找到我的解决方案。
当我们滑动视图时,我使用了一个变量来保存我们翻译的距离计数器。
使用它来做一些 if 检查,你会得到你需要的确切行为。
新行为的视频示例(拖过目标、落后于起点、快到起点和快到目标):
代码如下:
@objc func xButtonWasDragged(_ sender: UIPanGestureRecognizer) {
if sender.state == UIGestureRecognizerState.began || sender.state == UIGestureRecognizerState.changed {
self.view.bringSubview(toFront: xButton)
let translation = sender.translation(in: self.view)
//Move the view
xButton.center = CGPoint(x: xButton.center.x + translation.x, y: xButton.center.y)
distanceCounter += translation.x
//if moved left dont add to our distance counter
if distanceCounter < 0 {
distanceCounter = 0
}
// prevent button from moving left from start
if xButton.center.x < startingPointxBtn {
xButton.center.x = startingPointxBtn
} else if xButton.center.x > largeCircle.center.x && distanceCounter > xBtnDistance {
xButton.center.x = largeCircle.center.x
distanceCounter = xBtnDistance
// If we hit our target center and go over it in our distance counter
// make our distance be reached and forced to the center
} else {
// set the translation
sender.setTranslation(CGPoint.zero, in: self.view)
}
} else if sender.state == UIGestureRecognizerState.ended {
// If you let go of button within a distance, snap to center
if largeCircle.center.x - xButton.center.x <= 35.0 {
xButton.center = largeCircle.center
} else {
// if none of these conditions meet make it snap to start
xButton.center.x = startingPointxBtn
}
// reset our counter to always begin with zero
distanceCounter = 0
}
}