Swift - パンで指についてくるビューをつくる

案外、パン(PCでいうドラッグ)でViewがついてくるような処理の書き方を思い出せなかったので、
備忘録的にメモ。

import UIKit

class ViewController: UIViewController, UIGestureRecognizerDelegate {
    
    var myView: UIView!
    var myView2: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()
        
        myView = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
        myView.backgroundColor = UIColor.blackColor()
        myView.center = view.center
        view.addSubview(myView)
        addGestureRecognizer(myView)
        
        myView2 = UIView(frame: CGRect(x: 0, y: 0, width: 200, height: 200))
        myView2.backgroundColor = UIColor.redColor()
        myView2.center = view.center
        view.addSubview(myView2)
        addGestureRecognizer(myView2)
    }
    
    func addGestureRecognizer(target: UIView) {
        let panGestureRec = UIPanGestureRecognizer(target: self, action: #selector(self.panGestureReceived(_:)))
        target.addGestureRecognizer(panGestureRec)
    }
    
    func panGestureReceived(sender: UIPanGestureRecognizer) {
        guard let target = sender.view else {
            return
        }
        
        // translationInViewが返す値は、パンが始まってからの蓄積された値となる
        let p = sender.translationInView(self.view)
        
        // 移動先座標
        let moved = CGPoint(x: target.center.x + p.x, y: target.center.y + p.y)
        target.center = moved
        
        // リセット
        sender.setTranslation(CGPoint.zero, inView: self.view)
    }
}