Остановить перемещение UIPanGestureRecognizer за пределы порога - PullRequest
0 голосов
/ 16 мая 2018

У меня есть жест, который относится к одному из моих взглядов. Жест не отпустит его назад и не позволит ему пройти мимо центра цели.

Если пользователь перетаскивает цель за зеленую сторону, он останется в центре, но как только он начнет тянуть назад к кнопке, он отступит. Даже если палец пользователя не находится над представлением 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
        }
    }

}

Пример видео:

enter image description here

1 Ответ

0 голосов
/ 17 мая 2018

Я реализовал ответ. Любой, кто ищет подобное поведение, может предложить мое решение.

Я использовал переменную для хранения счетчика расстояний наших переводов, пока мы скользили в нашем представлении.

Используйте это, чтобы выполнить некоторые проверки, и вы получите точное поведение, которое вам нужно.

видео пример нового поведения (перетаскивание мимо цели, позади старта, привязка к началу и привязка к цели):

enter image description here

код ниже:

@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
    }
}
...