他の資料を参考にしようとしても、GestureRecognizerの表記がSwift3以降変わっていたりするためうまく回転のコーディングをすることができませんでした。

2本の指で画像を回転させることで、好きな角度に配置できるようにしたいです。
作りたいものとしては、スタンプのように画像を好きな位置に好きな大きさ・角度で配置できるものです。

回転のサンプルコードやアドバイスなど、ご教授お願いします。

移動・拡大縮小まではなんとかできたので、そのコードを下に載せました。

参考資料1
参考資料2

import UIKit

class ViewController2: UIViewController, UIGestureRecognizerDelegate,UIImagePickerControllerDelegate,UINavigationControllerDelegate {

    // 画像の拡大率
    var currentScale:CGFloat = 1.0

    let firstImg: UIImage = UIImage(named: "IMG_6632.JPG")!
    @IBOutlet weak var getphoto: UIImageView!    

    override func viewDidLoad() {
        super.viewDidLoad()
    getphoto.image = firstImg

   // タッチ操作を enable
        getphoto.isUserInteractionEnabled = true
        self.view?.addSubview(getphoto)

    // imageViewにジェスチャーレコグナイザを設定する(ピンチ)  拡大縮小
        let pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(pinchAction(sender:)))
        getphoto.addGestureRecognizer(pinchGesture)

///////////////////////////////////////////画像の移動↓

    // タッチしたビューの中心とタッチした場所の座標のズレを保持する変数
    var gapX:CGFloat = 0.0  // x座標
    var gapY:CGFloat = 0.0  // y座標

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        // 最初にタッチした指のみ取得
        if let touch = touches.first {
            // タッチしたビューをviewプロパティで取得する
            if let touchedView = touch.view {
                // tag1のものを動かす
                if touchedView.tag == 1 {
                    // タッチした場所とタッチしたビューの中心座標がどうずれているか?
                    gapX = touch.location(in: view).x - touchedView.center.x
                    gapY = touch.location(in: view).y - touchedView.center.y
                    // 例えば、タッチしたビューの中心のxが50、タッチした場所のxが60→中心から10ずれ
                    // この場合、指を100に持って行ったらビューの中心は90にしたい
                    // ビューの中心90 = 持って行った場所100 - ずれ10
                    touchedView.center = CGPoint(x: touch.location(in: view).x - gapX, y: touch.location(in: view).y - gapY)
                }
            }
        }
    }

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        // touchesBeganと同じ処理だが、gapXとgapYはタッチ中で同じものを使い続ける
        // 最初にタッチした指のみ取得
        if let touch = touches.first {
            // タッチしたビューをviewプロパティで取得する
            if let touchedView = touch.view {
                // tag1のものを動かす
                if touchedView.tag == 1 {
                    // gapX,gapYの取得は行わない
                    touchedView.center = CGPoint(x: touch.location(in: view).x - gapX, y: touch.location(in: view).y - gapY)
                }
            }
        }
    }

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        // gapXとgapYの初期化
        gapX = 0.0
        gapY = 0.0
    }

    override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
        // touchesEndedと同じ処理
        self.touchesEnded(touches, with: event)
    }
 ///////////////////////////////////////////拡大縮小↓

    @objc func pinchAction(sender: UIPinchGestureRecognizer) {
        // imageViewを拡大縮小する
        // ピンチ中の拡大率は0.3〜2.5倍、指を離した時の拡大率は0.5〜2.0倍とする
        switch sender.state {
        case .began, .changed:
            // senderのscaleは、指を動かしていない状態が1.0となる
            // 現在の拡大率に、(scaleから1を引いたもの) / 10(補正率)を加算する
            currentScale = currentScale + (sender.scale - 1) / 10
            // 拡大率が基準から外れる場合は、補正する
            if currentScale < 0.3 {
                currentScale = 0.3
            } else if currentScale > 2.5 {
                currentScale = 2.5
            }
            // 計算後の拡大率で、imageViewを拡大縮小する
            getphoto.transform = CGAffineTransform(scaleX: currentScale, y: currentScale)
        default:
            // ピンチ中と同様だが、拡大率の範囲が異なる
            if currentScale < 0.5 {
                currentScale = 0.5
            } else if currentScale > 2.0 {
                currentScale = 2.0
            }

            // 拡大率が基準から外れている場合、指を離したときにアニメーションで拡大率を補正する
            // 例えば指を離す前に拡大率が0.3だった場合、0.2秒かけて拡大率が0.5に変化する
            UIView.animate(withDuration: 0.2, animations: {
                self.getphoto.transform = CGAffineTransform(scaleX: self.currentScale, y: self.currentScale)
            }, completion: nil)

        }
    }

//////////////////////////////////////////////////↑

  //リコグナイザーの同時検知を許可するメソッド
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        return true
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}