Swift 停止UIPAngestureRecognitor移动超过阈值
我有一个手势是在我的观点之一。这个手势不会让球倒退,也不会阻止球越过球门中心 如果用户拖过球门到绿色的一边,它将停留在中间,但一旦他们开始拖回按钮,它将后退。即使用户的手指不在XButton视图上 此处的代码示例:Swift 停止UIPAngestureRecognitor移动超过阈值,swift,uigesturerecognizer,uipangesturerecognizer,translate-animation,Swift,Uigesturerecognizer,Uipangesturerecognizer,Translate Animation,我有一个手势是在我的观点之一。这个手势不会让球倒退,也不会阻止球越过球门中心 如果用户拖过球门到绿色的一边,它将停留在中间,但一旦他们开始拖回按钮,它将后退。即使用户的手指不在XButton视图上 此处的代码示例: let xGestureDrag = UIPanGestureRecognizer(target: self, action: #selector(AdViewPageVC.xButtonWasDragged(_:))) @objc func xButtonWasDragged(_
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
}
}
}
让xGestureDrag=UIPangestureRecognitor(目标:self,操作:#选择器(AdViewPageVC.xButtonWasDraged(:))
@objc func XBUTTONWASTRADG(uu发送方:UIPANGESTURE识别器){
如果sender.state==UIGestureRecognitizerState.Start | | sender.state==UIGestureRecognitizerState.changed{
self.view.bringSubview(toFront:xButton)
让translation=sender.translation(在:self.view中)
打印(翻译.x)
xButton.center=CGPoint(x:xButton.center.x+translation.x,y:xButton.center.y)
如果xButton.center.x<起始点xbtn{
xButton.center.x=起始点xbtn
}否则,如果xButton.center.x>largeCircle.center.x{
xButton.center.x=大圆圈.center.x
}
sender.setTranslation(CGPoint.zero,in:self.view)
}如果sender.state==UIgestureRecognitizerState.ended,则为else{
如果largeCircle.center.x-xButton.center.x我已经实现了一个答案。对于任何寻找这种行为的人,你都可以得到我的解决方案
当我们滑动视图时,我使用了一个变量来保存翻译的距离计数器
使用此选项进行一些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
}
}
@objc func xbuttonwasradg(uu发送方:UIPangestureRecognitizer){
如果sender.state==UIGestureRecognitizerState.Start | | sender.state==UIGestureRecognitizerState.changed{
self.view.bringSubview(toFront:xButton)
让translation=sender.translation(在:self.view中)
//移动视图
xButton.center=CGPoint(x:xButton.center.x+translation.x,y:xButton.center.y)
距离计数器+=平移.x
//如果向左移动,不要添加到我们的距离计数器
如果距离计数器<0{
距离计数器=0
}
//防止按钮从开始向左移动
如果xButton.center.x<起始点xbtn{
xButton.center.x=起始点xbtn
}否则,如果xButton.center.x>largeCircle.center.x&&distance counter>xbtn距离{
xButton.center.x=大圆圈.center.x
距离计数器=xbtn距离
//如果我们击中目标中心并在距离计数器中越过它
//使我们的距离达到并被强迫到中心
}否则{
//设置翻译
sender.setTranslation(CGPoint.zero,in:self.view)
}
}如果sender.state==UIgestureRecognitizerState.ended,则为else{
//若在一段距离内松开按钮,则捕捉到中心
如果较大的圆.center.x-xButton.center.x