画像をピンチイン・アウトすることで拡大縮小を行いたいです。
swift5、xcode11.3、storyboardを使ってアプリ作成をしています。
したいことは、単一写真を表示して画像の拡大・縮小・移動させることです。
イメージとしてはiphoneの写真アプリのような動作です。
下記のURLを真似してプログラムを作成しました。
teratail
ビルドするといくつかエラーが表示されましたが、xcodeの補完機能を使うことで
残り1つまで減らしました。
(ほとんどがoverride , @objcを削除するものでした)
唯一残ったエラーが下記のコード部分で、
swift
1 let pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(pinchAction(sender:)))
エラーメッセージ:
Use of local variable 'pinchAction(sender:)' before its declaration
でした。
調べると、宣言前に変数を使っているということでした。
###試したこと
swift
1let pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(pinchAction(sender:))) 2getphoto.addGestureRecognizer(pinchGesture) 3```上記の2行を、いろいろな場所へ移動して見ましたが、エラーは消えませんでした。 4(場所によってはエラーメッセージが変わりました) 5 6また、func pinchActionに対して@objcをつけてみましたが 7エラーが出ました。(@objcを外せというエラー) 8 9このエラーを消すにはどうすればよいか、教えていただけると助かります。 10よろしくお願いします。 11 12###修正後のソース全文 13```swift 14import UIKit 15 16 17class ViewController2: UIViewController, UIGestureRecognizerDelegate,UIImagePickerControllerDelegate,UINavigationControllerDelegate { 18 19 // 画像の拡大率 20 var currentScale:CGFloat = 1.0 21 22 let firstImg: UIImage = UIImage(named: "IMG_6632.JPG")! 23 @IBOutlet weak var getphoto: UIImageView! 24 25 override func viewDidLoad() { 26 super.viewDidLoad() 27 getphoto.image = firstImg 28 29 // タッチ操作を enable 30 getphoto.isUserInteractionEnabled = true 31 self.view?.addSubview(getphoto) 32 33 // imageViewにジェスチャーレコグナイザを設定する(ピンチ) 拡大縮小 34//下記の文1でエラー発生 35//Use of local variable 'pinchAction(sender:)' before its declaration 36 /* 1 */ let pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(pinchAction(sender:))) 37 getphoto.addGestureRecognizer(pinchGesture) 38 39///////////////////////////////////////////画像の移動↓ 40 41 // タッチしたビューの中心とタッチした場所の座標のズレを保持する変数 42 var gapX:CGFloat = 0.0 // x座標 43 var gapY:CGFloat = 0.0 // y座標 44 45 46 47 func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 48 // 最初にタッチした指のみ取得 49 if let touch = touches.first { 50 // タッチしたビューをviewプロパティで取得する 51 if let touchedView = touch.view { 52 // tag1のものを動かす 53 if touchedView.tag == 1 { 54 // タッチした場所とタッチしたビューの中心座標がどうずれているか? 55 gapX = touch.location(in: view).x - touchedView.center.x 56 gapY = touch.location(in: view).y - touchedView.center.y 57 // 例えば、タッチしたビューの中心のxが50、タッチした場所のxが60→中心から10ずれ 58 // この場合、指を100に持って行ったらビューの中心は90にしたい 59 // ビューの中心90 = 持って行った場所100 - ずれ10 60 touchedView.center = CGPoint(x: touch.location(in: view).x - gapX, y: touch.location(in: view).y - gapY) 61 } 62 } 63 } 64 } 65 66 func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 67 // touchesBeganと同じ処理だが、gapXとgapYはタッチ中で同じものを使い続ける 68 // 最初にタッチした指のみ取得 69 if let touch = touches.first { 70 // タッチしたビューをviewプロパティで取得する 71 if let touchedView = touch.view { 72 // tag1のものを動かす 73 if touchedView.tag == 1 { 74 // gapX,gapYの取得は行わない 75 touchedView.center = CGPoint(x: touch.location(in: view).x - gapX, y: touch.location(in: view).y - gapY) 76 } 77 } 78 } 79 } 80 81 func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { 82 // gapXとgapYの初期化 83 gapX = 0.0 84 gapY = 0.0 85 } 86 87 func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) { 88 // touchesEndedと同じ処理 89 self.touchesEnded(touches, with: event) 90 } 91 ///////////////////////////////////////////拡大縮小↓ 92 93 94 func pinchAction(sender: UIPinchGestureRecognizer) { 95 // imageViewを拡大縮小する 96 // ピンチ中の拡大率は0.3〜2.5倍、指を離した時の拡大率は0.5〜2.0倍とする 97 switch sender.state { 98 case .began, .changed: 99 // senderのscaleは、指を動かしていない状態が1.0となる 100 // 現在の拡大率に、(scaleから1を引いたもの) / 10(補正率)を加算する 101 currentScale = currentScale + (sender.scale - 1) / 10 102 // 拡大率が基準から外れる場合は、補正する 103 if currentScale < 0.3 { 104 currentScale = 0.3 105 } else if currentScale > 2.5 { 106 currentScale = 2.5 107 } 108 // 計算後の拡大率で、imageViewを拡大縮小する 109 getphoto.transform = CGAffineTransform(scaleX: currentScale, y: currentScale) 110 default: 111 // ピンチ中と同様だが、拡大率の範囲が異なる 112 if currentScale < 0.5 { 113 currentScale = 0.5 114 } else if currentScale > 2.0 { 115 currentScale = 2.0 116 } 117 118 // 拡大率が基準から外れている場合、指を離したときにアニメーションで拡大率を補正する 119 // 例えば指を離す前に拡大率が0.3だった場合、0.2秒かけて拡大率が0.5に変化する 120 UIView.animate(withDuration: 0.2, animations: { 121 self.getphoto.transform = CGAffineTransform(scaleX: self.currentScale, y: self.currentScale) 122 }, completion: nil) 123 124 } 125 } 126 127//////////////////////////////////////////////////↑ 128 129 func didReceiveMemoryWarning() { 130 super.didReceiveMemoryWarning() 131 // Dispose of any resources that can be recreated. 132} 133 134} 135}
エラー箇所のみコメントを追加しています。
ご確認していただけると幸いです。よろしくお願いします。
回答2件
あなたの回答
tips
プレビュー