平移手势使视图在拖动时从手指跳开
Pan Gesture making view jump away from finger on drag
我在尝试使用平移手势识别器拖动视图时遇到问题。该视图是一个 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
}
}
}
第一张图是拖动开始之前,第二张是向上拖动时的样子。
您正在使用 self.center
而不是使用 self.frame.origin.x
和 self.frame.origin.y
然后稍后您将设置翻译并将其添加到 lastLocation。
实际上发生的事情是您的视图正在计算从视图中心更改的位置,就好像您从该位置完美拖动然后平移 + lastLocation。我相信只要阅读您就知道这个问题。
修复很简单。
self.frame.origin.x = translation.x
self.frame.origin.y = translation.y
区别在于开始计算与翻译。 Origin 将根据触摸事件开始的位置获取 x/y 位置。而 .center
总是从中心开始。
我在尝试使用平移手势识别器拖动视图时遇到问题。该视图是一个 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
}
}
}
第一张图是拖动开始之前,第二张是向上拖动时的样子。
您正在使用 self.center
而不是使用 self.frame.origin.x
和 self.frame.origin.y
然后稍后您将设置翻译并将其添加到 lastLocation。
实际上发生的事情是您的视图正在计算从视图中心更改的位置,就好像您从该位置完美拖动然后平移 + lastLocation。我相信只要阅读您就知道这个问题。
修复很简单。
self.frame.origin.x = translation.x
self.frame.origin.y = translation.y
区别在于开始计算与翻译。 Origin 将根据触摸事件开始的位置获取 x/y 位置。而 .center
总是从中心开始。