停止 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
    }
}