質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

399閲覧

画像をRotationやPinchを使って回転、拡大縮小させたいけど、画像が小さくなるとスムーズに動かせない

mimamo

総合スコア44

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2019/01/19 03:58

前提・実現したいこと

画像をRotationやPinch、touchを使って自由に移動、回転、拡大縮小できるようにしたのですが、実機で試してみると画像がある程度小さくなると扱いずらくなってしまいます。
2本指で行う回転、拡大縮小がやりずらくなってしまいます。画像が小さくなってもスムーズに操作できるようにしたいです。

ご教授よろしくお願いいたします。

該当のソースコード

swift

1 2import UIKit 3 4class ViewController2: UIViewController, UIGestureRecognizerDelegate,UIImagePickerControllerDelegate,UINavigationControllerDelegate { 5 6 @IBOutlet var rotationRecognizer: UIRotationGestureRecognizer! 7 @IBOutlet var pinchRecognizer: UIPinchGestureRecognizer! 8 9 var scale:CGFloat = 1.0 10 var Rotation:CGFloat = 0.0 11 var affine1:CGAffineTransform = CGAffineTransform() 12 var affine2:CGAffineTransform = CGAffineTransform() 13 let firstImg: UIImage = UIImage(named: "IMG_6632.JPG")! 14 @IBOutlet weak var getphoto: UIImageView! 15 16 override func viewDidLoad() { 17 super.viewDidLoad() 18 19 //デリゲート先に自分を設定する。 20 rotationRecognizer.delegate = self 21 pinchRecognizer.delegate = self 22 23 //アフィン変換の初期値を設定する。 24 prevEndPinch = getphoto.transform 25 prevEndRotate = getphoto.transform 26 prevPinch = getphoto.transform 27 prevRotate = getphoto.transform 28 29 // タッチ操作を enable 30 getphoto.isUserInteractionEnabled = true 31 self.view?.addSubview(getphoto) 32 33 34 getphoto.image = firstImg 35} 36 37////////////////////////////////拡大・回転↓ 38 39 //ドラッグ終了時のアフィン変換 40 var prevEndPinch:CGAffineTransform = CGAffineTransform() 41 var prevEndRotate:CGAffineTransform = CGAffineTransform() 42 43 //ドラッグ中の前回アフィン変換 44 var prevPinch:CGAffineTransform = CGAffineTransform() 45 var prevRotate:CGAffineTransform = CGAffineTransform() 46 47 48 49 @IBAction func pinchPhoto(_ sender: UIPinchGestureRecognizer) { 50 print("pinch!") 51 //前回ドラッグ終了時の拡大縮小を引き継いだアフィン変換を行う。 52 let nowPinch = 53 prevEndPinch.scaledBy(x: sender.scale, y: sender.scale) 54 55 //拡大縮小と回転のアフィン変換を合わせたものを登録する。 56 getphoto.transform = prevRotate.concatenating(nowPinch) 57 58 59 //今回の拡大縮小のアフィン変換をクラス変数に保存する。 60 prevPinch = nowPinch 61 62 if(sender.state == UIGestureRecognizerState.ended) { 63 //ドラッグ終了時の拡大終了のアフィン変換をクラス変数に保存する。 64 prevEndPinch = nowPinch 65 } 66 67///////////////////////////////////////////画像の 68 69 //移動↓ 70 71 //タッチしたビューの中心とタッチした場所の座標のズレを保持する変数 72 var gapX:CGFloat = 0.0 // x座標 73 var gapY:CGFloat = 0.0 // y座標 74 75 76 // タッチした位置で最初に見つかったところにあるビューを取得してしまおうという魂胆 77 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 78 // 最初にタッチした指のみ取得 79 if let touch = touches.first { 80 print("touchbegin!") 81 // タッチしたビューをviewプロパティで取得する 82 if let touchedView = touch.view { 83 // tag1のものを動かす 84 if touchedView.tag == 1 { 85 // タッチした場所とタッチしたビューの中心座標がどうずれているか? 86 gapX = touch.location(in: view).x - touchedView.center.x 87 gapY = touch.location(in: view).y - touchedView.center.y 88 // 例えば、タッチしたビューの中心のxが50、タッチした場所のxが60→中心から10ずれ 89 // この場合、指を100に持って行ったらビューの中心は90にしたい 90 // ビューの中心90 = 持って行った場所100 - ずれ10 91 touchedView.center = CGPoint(x: touch.location(in: view).x - gapX, y: touch.location(in: view).y - gapY) 92 } 93 } 94 } 95 } 96 97override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 98// 最初にタッチした指のみ取得 99 if let touch = touches.first { 100 // タッチしたビューをviewプロパティで取得する 101 if let touchedView = touch.view { 102 // tag1のものを動かす 103 if touchedView.tag == 1 { 104 // gapX,gapYの取得は行わない 105 touchedView.center = CGPoint(x: touch.location(in: view).x - gapX, y: touch.location(in: view).y - gapY) 106 107 } 108 } 109 } 110 } 111 112override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { 113 114 // gapXとgapYの初期化 115 gapX = 0.0 116 gapY = 0.0 117 } 118 119 override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) { 120 // touchesEndedと同じ処理 121 self.touchesEnded(touches, with: event) 122 } 123 124 125 //リコグナイザーの同時検知を許可するメソッド 126 func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { 127 return true 128 } 129 130

補足情報(FW/ツールのバージョンなど)

参考資料
参考資料

Swiftのversionは4.1.2
Xcodeのversionは9.4.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

rotationRecognizerやpinchRecognizerはgetphotoに紐付いているんでしょうか?

仮にそうだとすると、後やれることはこれらのジェスチャーをgetphotoではなくViewControllerのviewに紐付けることぐらいかなあと思います。
(もしくは、ダミーのビューを広めに敷いておいてそこに紐付ける)

そうすると、画像が小さくなっても、応答するビューの範囲は広いままなので、ピンチ操作等もできます。

投稿2019/01/21 07:55

takabosoft

総合スコア8356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mimamo

2019/01/21 14:38

ご回答ありがとうございます! 頂いたアドバイス通り、viewに紐付けをしたら画像が小さくなっても操作できました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問