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

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

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

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

Q&A

解決済

1回答

318閲覧

複数の画像を挿入した後、画像をピンチイン、アウトできない。

退会済みユーザー

退会済みユーザー

総合スコア0

Swift

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

0グッド

0クリップ

投稿2019/02/01 06:38

最後に挿入した画像はドラッグ、ピンチイン、アウトができますが、それ以前の画像はドラッグしかできなくなります。
imagePickerControllerで処理したものをグローバル変数hogeに代入するというやりかたがまずいのでしょうか。
よろしくお願いいたします。

swift

1 2import UIKit 3class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate, UIGestureRecognizerDelegate { 4// タッチしたビューの中心とタッチした場所の座標のズレを保持する変数 5var gapX:CGFloat = 0.0 6var gapY:CGFloat = 0.0 7var currentScale:CGFloat = 1.0 8 9var hoge = UIImageView() 10 11let botan: UIButton = { 12 let button = UIButton(type: .system) 13 button.backgroundColor = UIColor.green 14 button.translatesAutoresizingMaskIntoConstraints = false 15 button.addTarget(self, action: #selector(handlePlusPhoto), for: .touchUpInside) 16 return button 17} () 18 19@objc func handlePlusPhoto() { 20 let imagePickerController = UIImagePickerController() 21 imagePickerController.delegate = self 22 imagePickerController.allowsEditing = true 23 present(imagePickerController, animated: true, completion: nil) 24 25}//フォトライブラリに行く処理 26 27func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { 28 if let edited = info[UIImagePickerController.InfoKey.editedImage] as? UIImage { 29 30 let image = UIImageView(image: UIImage?(edited)) 31 32 image.tag = 1 33 34 let pinch = UIPinchGestureRecognizer(target:self, action: #selector(pinchAction(sender:))) 35 image.addGestureRecognizer(pinch) 36 image.isUserInteractionEnabled = true 37 image.frame = CGRect(x: view.center.x - 200, y: view.center.y - 100, width: 400, height: 400) 38 image.layer.masksToBounds = true 39 image.layer.borderWidth = 2 40 image.layer.borderColor = UIColor.red.cgColor 41 42 hoge = image 43 44 view.addSubview(hoge) 45 46 } 47 //画像の選択画面を退けるために記載 48 dismiss(animated: true, completion: nil) 49}//フォトライブラリから写真を挿入する処理 50@objc func pinchAction(sender: UIPinchGestureRecognizer) { 51 print("pitni") 52 // imageViewを拡大縮小する 53 // ピンチ中の拡大率は0.3〜2.5倍、指を離した時の拡大率は0.5〜2.0倍とする 54 switch sender.state { 55 case .began, .changed: 56 // senderのscaleは、指を動かしていない状態が1.0となる 57 // 現在の拡大率に、(scaleから1を引いたもの) / 10(補正率)を加算する 58 currentScale = currentScale + (sender.scale - 1) / 10 59 // 拡大率が基準から外れる場合は、補正する 60 if currentScale < 0.3 { 61 currentScale = 0.3 62 } else if currentScale > 2.5 { 63 currentScale = 2.5 64 } 65 // 計算後の拡大率で、imageViewを拡大縮小する 66 hoge.transform = CGAffineTransform(scaleX: currentScale, y: currentScale) 67 default: 68 // ピンチ中と同様だが、拡大率の範囲が異なる 69 if currentScale < 0.5 { 70 currentScale = 0.5 71 } else if currentScale > 2.0 { 72 currentScale = 2.0 73 } 74 75 // 拡大率が基準から外れている場合、指を離したときにアニメーションで拡大率を補正する 76 // 例えば指を離す前に拡大率が0.3だった場合、0.2秒かけて拡大率が0.5に変化する 77 UIView.animate(withDuration: 0.2, animations: { 78 self.hoge.transform = CGAffineTransform(scaleX: self.currentScale, y: self.currentScale) 79 }, completion: nil) 80 81 } 82} //ピンチインアウトの処理 83 84override func viewDidLoad() { 85 super.viewDidLoad() 86 self.view.addSubview(botan) 87 botan.centerXAnchor.constraint(equalTo: self.view.centerXAnchor).isActive = true 88 botan.centerYAnchor.constraint(equalTo: self.view.centerYAnchor).isActive = true 89 botan.widthAnchor.constraint(equalToConstant: 140).isActive = true 90 botan.heightAnchor.constraint(equalToConstant: 140).isActive = true 91 92} 93 94override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 95 // 最初にタッチした指のみ取得 96 if let touch = touches.first { 97 // タッチしたビューをviewプロパティで取得する 98 if let touchedView = touch.view { 99 if touchedView.tag == 1 { 100 // タッチした場所とタッチしたビューの中心座標がどうずれているか? 101 gapX = touch.location(in: view).x - touchedView.center.x 102 gapY = touch.location(in: view).y - touchedView.center.y 103 104 touchedView.center = CGPoint(x: touch.location(in: view).x - gapX, y: touch.location(in: view).y - gapY) 105 } 106 } 107 } 108} 109override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 110 111 if let touch = touches.first { 112 // タッチしたビューをviewプロパティで取得する 113 if let touchedView = touch.view { 114 115 if touchedView.tag == 1 { 116 // gapX,gapYの取得は行わない 117 touchedView.center = CGPoint(x: touch.location(in: view).x - gapX, y: touch.location(in: view).y - gapY) 118 } 119 } 120 } 121} 122override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { 123 124 gapX = 0.0 125 gapY = 0.0 126} 127override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) { 128 self.touchesEnded(touches, with: event) 129} 130}

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

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

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

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

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

guest

回答1

0

ベストアンサー

直接の原因としては以下の箇所に問題があるようです。

1:UIImagePickerViewで選択した画像をセットした際に作成した新しいUIImageViewをhogeにセットされている。
2:画像選択の度にhogeを上書いているので、複数画像を選択した場合は最後のUIImageViewのインスタンスがhogeにセットされることになります。
3:ピンチのジェスチャーを受け取った際に、hogeに対して拡縮の操作しているので、最後にhogeにセットされたUIImageViewが拡縮されてしまっています。

例えば、以下の様にピンチのジェスチャーを受け取った際に、ジェスチャーからピンチ操作されているUIImageViewを取得して、それに対して拡縮の操作を行うことで対応可能です。
※コメントで修正箇所1,2,3とした箇所を参照ください。

swift

1@objc func pinchAction(sender: UIPinchGestureRecognizer) { 2 print("pitni") 3 // imageViewを拡大縮小する 4 // ピンチ中の拡大率は0.3〜2.5倍、指を離した時の拡大率は0.5〜2.0倍とする 5 6 // 修正箇所1:senderから操作対象のUIImageViewを取得 7 guard let target = sender.view as? UIImageView else { 8 return 9 } 10 11 switch sender.state { 12 case .began, .changed: 13 // senderのscaleは、指を動かしていない状態が1.0となる 14 // 現在の拡大率に、(scaleから1を引いたもの) / 10(補正率)を加算する 15 currentScale = currentScale + (sender.scale - 1) / 10 16 // 拡大率が基準から外れる場合は、補正する 17 if currentScale < 0.3 { 18 currentScale = 0.3 19 } else if currentScale > 2.5 { 20 currentScale = 2.5 21 } 22 // 計算後の拡大率で、imageViewを拡大縮小する 23 // 修正箇所2:hoge→targetに変更 24 target.transform = CGAffineTransform(scaleX: currentScale, y: currentScale) 25 default: 26 // ピンチ中と同様だが、拡大率の範囲が異なる 27 if currentScale < 0.5 { 28 currentScale = 0.5 29 } else if currentScale > 2.0 { 30 currentScale = 2.0 31 } 32 33 // 拡大率が基準から外れている場合、指を離したときにアニメーションで拡大率を補正する 34 // 例えば指を離す前に拡大率が0.3だった場合、0.2秒かけて拡大率が0.5に変化する 35 UIView.animate(withDuration: 0.2, animations: { 36 // 修正箇所3:hoge→targetに変更 37 target.transform = CGAffineTransform(scaleX: self.currentScale, y: self.currentScale) 38 }, completion: nil) 39 40 } 41} //ピンチインアウトの処理 42

投稿2019/02/01 08:15

fumiaki

総合スコア56

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

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

退会済みユーザー

退会済みユーザー

2019/02/02 05:19

@objc func の中で処理すればよかったのですね。ありがとうございます。 guardについて知らなかったので、勉強になりました。重ねてお礼申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問