Swift4で画像をタッチによって回転させるためのコードがわかりません。
他の資料を参考にしようとしても、GestureRecognizerの表記がSwift3以降変わっていたりするためうまく回転のコーディングをすることができませんでした。
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.
}
}