You are on the right track with the UIPanGestureRecognizer
. You are likely missing the began and end gesture state handling. Here is a full solution I just put together in sample project (Swift) with a panView as a subclass of the view controller's root view.
class ViewController: UIViewController {
@IBOutlet weak var panView: UIView!
// records the view's center for use as an offset while dragging
var viewCenter: CGPoint!
override func viewDidLoad() {
super.viewDidLoad()
panView.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: #selector(self.dragView)))
}
func dragView(gesture: UIPanGestureRecognizer) {
let target = gesture.view!
switch gesture.state {
case .began, .ended:
viewCenter = target.center
case .changed:
let translation = gesture.translation(in: self.view)
target.center = CGPoint(x: viewCenter!.x + translation.x, y: viewCenter!.y + translation.y)
default: break
}
}
}