平移手势使视图在拖动时远离手指

时间:2020-04-10 17:11:17

标签: ios swift uicollectionview uicollectionviewcell uipangesturerecognizer

尝试使用平移手势识别器拖动视图时遇到问题。该视图是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 个答案:

答案 0 :(得分:1)

您使用的是self.center而不是self.frame.origin.xself.frame.origin.y,然后您要设置翻译并将其添加到lastLocation。

有效地是,您的视图正在计算从视图中心更改的位置,就像您从该位置完美拖动然后平移+ lastLocation一样。我敢肯定,只需阅读您就知道该问题。

修复很简单。

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

差异是翻译的起始计算。原点将根据触摸事件的开始位置获取x / y位置。而.center始终从中心移开。