Сценарий следующий: пользователь касается и удерживает палец, чтобы провести 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 в моем коде. Также эта разница кажется также появляется, если пользователь проводит справа налево.
Могу ли я уловить разницу в переводе и как-то избавиться от нее непосредственно перед сменой направления?