Разница в переводе движения при смещении влево кадра за фиксированную точку и изменении направления с помощью вправо для обновления кадра - PullRequest
0 голосов
/ 27 августа 2018

Сценарий следующий: пользователь касается и удерживает палец, чтобы провести UIView влево, чтобы показать другой вид внизу. Видимый вид прокручивается на 50 пунктов влево и затем останавливается. Рамка вида переводится как -50

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

Проблема в том, что, хотя пользователь прокручивает дальше фиксированной точки -50, где останавливается фрейм, перевод по-прежнему записывается, и когда пользователь изменяет направление смахивания вправо, представление перемещается с разницей, которую я хотел бы устранить. Эта разница в переводе, по-видимому, формирует точку остановки представления до точки, в которой пользователь изменил направление перелистывания. Вот мой код:

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        drabbleLayer.isUserInteractionEnabled = true
        let recognizer = UIPanGestureRecognizer(target: self, action: #selector(handlePan(recognizer:)))
       drabbleLayer.addGestureRecognizer(recognizer)
    }

    @objc func handlePan(recognizer: UIPanGestureRecognizer) {
        if recognizer.state == .began {
            originalCenter = self.drabbleLayer!.center
        }

        var velocity = recognizer.velocity(in: drabbleLayer)

        if recognizer.state == .changed {

            let targetX: CGFloat = -50.0

            var tranlastion = recognizer.translation(in: self.drabbleLayer!)

            var newX: CGFloat {
                return originalCenter.x + tranlastion.x
            }

            if velocity.x < 0 {

                let log = tranlastion.x >= targetX
                let log2 = drabbleLayer.frame.origin.x >= targetX

                if  log && log2 {

                    dabbleLayer!.center.x = newX

                } else { drabbleLayer.center.x = -targetX * 2}

            } else {
                //this is where the Difference in Translation is noticeable if user swipes way beyond the stopping point to the left 
                if drabbleLayer.frame.origin.x <= 0 {
                    drabbleLayer!.center.x = newX

                } else {
                    //here view has to get to a full stop. Doesn't seem to work properly. 
                    drabbleLayer.frame.orgin.x = 0}
            }
        }
}

В своем полном коде я напечатал значения перевода, чтобы видеть, где они меняются. Я проверяю направление движения по скорости. Дело в том, что после изменения направления трансляция изменяется, скажем, от -74 до 200. В этом случае разница будет 74 (перевод) - 50 (что является точкой остановки, targetX в моем коде. Также эта разница кажется также появляется, если пользователь проводит справа налево.

Могу ли я уловить разницу в переводе и как-то избавиться от нее непосредственно перед сменой направления?

1 Ответ

0 голосов
/ 30 августа 2018

Наконец я нашел решение этой проблемы. Мне все еще не удавалось найти прямое решение, такое как сохранение последнего значения перевода непосредственно перед изменением направления, чтобы я мог вычислить разницу в переводе.

Однако, альтернативно и непосредственно перед изменением направления я установил перевод на значение targetX, поэтому больше не нужно было вычитать разницу в переводе. Вот мой новый код:

@objc func handlePan(recognizer: UIPanGestureRecognizer) {

    var tranlastion = recognizer.translation(in: self.incomeDrabbleLayer!)

    var newX: CGFloat {
        return originalCenter.x + tranlastion.x
    }

    let targetX: CGFloat = -50.0

    if recognizer.state == .began {
        originalCenter = self.incomeDrabbleLayer!.center
    }

    let velocity = recognizer.velocity(in: incomeDrabbleLayer)

    if recognizer.state == .changed {

        if velocity.x < 0 {
            if incomeDrabbleLayer.frame.origin.x > targetX {

                incomeDrabbleLayer.center.x = newX

            } else {

                incomeDrabbleLayer.frame.origin.x = targetX

                let targetTranslationPoint = CGPoint(x: targetX, y: 0)
                recognizer.setTranslation(targetTranslationPoint, in: incomeDrabbleLayer)
            }

        } else {

            if incomeDrabbleLayer.frame.origin.x < 0 {
                incomeDrabbleLayer.center.x = newX
            } else {
                incomeDrabbleLayer.frame.origin.x = 0
                recognizer.setTranslation(.zero, in: incomeDrabbleLayer)
            }

        }
    }

}
...