Быстрые и непоследовательные значения перевода жестов панорамирования - PullRequest
0 голосов
/ 05 марта 2019

У меня есть UITableViewCell с некоторым текстом и UIImageView.Я хотел, чтобы в UIImageView было распознавание пинч и панорамирование, имитирующее Instagram.Я действительно запутался, потому что у меня один и тот же подкласс UITableViewCell в двух разных представлениях, и они ведут себя по-разному.В одном представлении, ячейка является единственной ячейкой в ​​первом разделе таблицы, и она отлично перемещается и сжимается.Но с другой стороны, иногда (возможно, в половине случаев), когда я зажимаю и панорамирую, UIImageView движется намного дальше и быстрее, чем мои пальцы.Точки на изображении, которые мои пальцы начинают заново, перемещаются в направлении, куда я двигаюсь, намного больше, чем мои пальцы, и изображение быстро покидает экран.Мне кажется, что последнее, если в func pan () значения перевода выше, чем должны быть, и поэтому view.center.x и view.center.y увеличиваются слишком быстро, но я не уверен, что этоэто проблема или если да, то, что вызывает это.Я не могу точно воспроизвести проблему, поэтому у меня возникают проблемы с получением большого количества информации.Я использовал этот урок , чтобы создавать жесты панорамирования и пинчинга.Ниже приведен фрагмент моего кода.Любая помощь будет оценена.Я сбит с толку.

UITableViewCell:

var isZooming = false
var originalImageCenter: CGPoint?
var secondaryImageCenter: CGPoint?
var accessibleScale: CGFloat = 1 {
    didSet {
        panScale = accessibleScale
    }
}
var panScale: CGFloat = 1

func configureData(image: UIImage?, secondaryImage: UIImage?, exerciseName: String?, explanation: String?) {
    let pinch = UIPinchGestureRecognizer(target: self, action: #selector(self.pinch(sender:)))
    let secondaryPinch = UIPinchGestureRecognizer(target: self, action: #selector(self.pinch(sender:)))
    self.exerciseImageView.addGestureRecognizer(pinch)
    self.secondaryImageView.addGestureRecognizer(secondaryPinch)


    let pan = UIPanGestureRecognizer(target: self, action: #selector(self.pan(sender:)))
    let secondaryPan = UIPanGestureRecognizer(target: self, action: #selector(self.pan(sender:)))
    pan.delegate = self
    secondaryPan.delegate = self
    self.exerciseImageView.addGestureRecognizer(pan)
    self.secondaryImageView.addGestureRecognizer(secondaryPan)
}

@objc func pinch(sender:UIPinchGestureRecognizer) {
    guard let senderView = sender.view as! UIImageView? else {
        return
    }
    let currentScale = senderView.frame.size.width / senderView.bounds.size.width
    var newScale = currentScale * sender.scale
    accessibleScale = newScale
    if sender.state == .began {
        if newScale > 1 {
            self.isZooming = true
        }
    } else if sender.state == .changed {
        senderView.layer.zPosition = 1
        let pinchCenter = CGPoint(x: sender.location(in: senderView).x - senderView.bounds.midX,
                                  y: sender.location(in: senderView).y - senderView.bounds.midY)
        let transform = senderView.transform.translatedBy(x: pinchCenter.x, y: pinchCenter.y)
            .scaledBy(x: sender.scale, y: sender.scale)
            .translatedBy(x: -pinchCenter.x, y: -pinchCenter.y)
        if newScale < 1 {
            newScale = 1
            let transform = CGAffineTransform(scaleX: newScale, y: newScale)
            senderView.transform = transform
            sender.scale = 1
        } else {
            senderView.transform = transform
            sender.scale = 1
        }
    } else if sender.state == .ended || sender.state == .failed || sender.state == .cancelled {
        if senderView == exerciseImageView {
            guard let center = self.originalImageCenter else {return}
            UIView.animate(withDuration: 0.3, animations: {
                senderView.transform = CGAffineTransform.identity
                senderView.center = center
            }) { (bool) in
                senderView.layer.zPosition = 0
                self.isZooming = false
            }
        } else {
            guard let center = self.secondaryImageCenter else {return}
            UIView.animate(withDuration: 0.3, animations: {
                senderView.transform = CGAffineTransform.identity
                senderView.center = center
            }) { (bool) in
                senderView.layer.zPosition = 0
                self.isZooming = false
            }
        }
    }
}

@objc func pan(sender: UIPanGestureRecognizer) {
    guard let senderView = sender.view as! UIImageView? else {
        return
    }
    print(sender.translation(in: self))
    if self.isZooming && sender.state == .began {
        if sender.view == exerciseImageView {
            self.originalImageCenter = sender.view?.center
        } else {
            self.secondaryImageCenter = sender.view?.center
        }
    } else if self.isZooming && sender.state == .changed {
        let translation = sender.translation(in: self)
        if let view = sender.view {
            view.center = CGPoint(x:view.center.x + translation.x,
                                  y:view.center.y + translation.y )
        }
        sender.setTranslation(CGPoint.zero, in: senderView.superview)
    }
}
...