Пан Жест, заставляющий вид отскочить от пальца при перетаскивании - PullRequest
1 голос
/ 10 апреля 2020

У меня проблема при попытке перетащить вид с помощью средства распознавания жестов панорамирования. Представление - это collectionViewCell, и код перетаскивания работает, кроме случаев, когда при запуске перетаскивания вид переходит вверх и влево. Мой код ниже.

В collectionViewCell:

override func awakeFromNib() {
    super.awakeFromNib()
    let panRecognizer = UIPanGestureRecognizer(target:self, action:#selector(detectPan))
    self.gestureRecognizers = [panRecognizer]
}

var firstLocation = CGPoint(x: 0, y: 0)
    var lastLocation = CGPoint(x: 0, y: 0)
    @objc func detectPan(_ recognizer:UIPanGestureRecognizer) {
        switch recognizer.state {
        case .began:
            firstLocation = recognizer.translation(in: self.superview)
            lastLocation = recognizer.translation(in: self.superview)
        case .changed:
            let translation  = recognizer.translation(in: self.superview)
            self.center = CGPoint(x: lastLocation.x + translation.x, y: lastLocation.y + translation.y)
        default:
            UIView.animate(withDuration: 0.1) {
                self.center = self.firstLocation
            }
        }
    }

Первое изображение перед началом перетаскивания, второе - это то, что происходит при перетаскивании вверх.

enter image description here

enter image description here

1 Ответ

1 голос
/ 10 апреля 2020

Вы используете self.center вместо self.frame.origin.x и self.frame.origin.y, затем вы настраиваете перевод и добавляете его в lastLocation.

По сути, ваш вид вычисляет позицию, измененную из центра вида, как если бы вы отлично перетаскивали из этого местоположения, а затем переводили + lastLocation. Я уверен, просто прочитав, что вы знаете о проблеме.

Исправление простое.

self.frame.origin.x = translation.x
self.frame.origin.y = translation.y

Разница - это начальный расчет с переводом. Происхождение захватит позицию x / y в зависимости от того, где начинается событие касания. В то время как .center всегда идет от центра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...