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

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

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

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

解決済

2回答

1662閲覧

swift5で画像の拡大縮小を行いたいです。

Peter_Coter

総合スコア6

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

0クリップ

投稿2020/01/08 12:49

編集2020/01/09 14:08

画像をピンチイン・アウトすることで拡大縮小を行いたいです。

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}

エラー箇所のみコメントを追加しています。
ご確認していただけると幸いです。よろしくお願いします。

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

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

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

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

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

takabosoft

2020/01/09 01:56

> (ほとんどがoverride , @objcを削除するものでした) その提案はおそらくほとんど間違いな気がするので、修正後のソースをすべて載せてください。
Peter_Coter

2020/01/09 14:09

本文を編集し、修正後のソースを載せました。 ご教授していただける箇所がありましたらよろしくお願いします。
guest

回答2

0

こちらの記事をみて、作り直したほうが速いかもしれません。
Qiita UIScrollViewでピンチ量を計算してズームするありがちな画像表示ビューを作る時代は終わった!!

こちらの記事は、もっと詳細に書かれています。
詳解UIScrollView 〜フォトビューワ編〜

ご参考にどうぞ。

投稿2020/01/11 07:34

eytyet

総合スコア803

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

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

Peter_Coter

2020/01/11 15:32

回答ありがとうございます。 色々調べていたのですが、この記事については見ておりませんでした。 今後のためにも参考にさせていただきたいと思います。
guest

0

ベストアンサー

エラーの原因は、viewDidLoadの終わりを }で閉じるのを忘れていて、
以降のメソッドが全てviewDidLoadメソッド内の続きの内部関数として
定義されてしまっているためです。

誤っているのは、overrideや@objcを使っていることではなく、
メソッドを内部関数とし定義してしまったことです。

viewDidLoadの終わりをきちんと }で閉じて、
続きのメソッドをviewDidLoadの外に定義し、
誤って削除したoverrideや@objcを元に戻せば
selectorのエラーも消えると思います。

投稿2020/01/10 16:22

TakeOne

総合スコア6299

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

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

Peter_Coter

2020/01/11 15:31

回答ありがとうございます。 おっしゃる通り、 viewDidLoadを閉じたらエラーがなくなりました。 (var gapX:CGFloat = 0.0 // x座標 の前の行に "}" を追加) その後、IBOutletがstoryboardと接続できない問題がありましたが、 クラス名が 「ViewController2」になっていたのがまずかったようです。 "2"を削除することで無事接続ができ、思った動作を実現することができました。 無事解決できたこと、非常に感謝いたします。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問