• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Swiftについて教えてください)

SwiftでUIImageViewにタッチの機能を追加する方法

このQ&Aのポイント
  • SwiftでUIImageViewにタッチの機能を追加する方法を教えてください。
  • let stamp = Timage()で呼び出しているサンプルを参考に、タッチをピンチジェスチャーに変更してlet stamp = Pimage()で呼び出すとエラーが発生します。
  • 引数が足りないというエラーが出るため、どのようにして呼び出すべきかわかりません。具体的な方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

http://swift-studying.com/blog/swift/?p=544 のGestureUIImageViewは、storyboardに貼りつけて使用する ことを前提に設計されています。 storyboardにGestureUIImageViewを貼りつけた場合、 画面生成時に init(coder aDecoder: NSCoder) が呼ばれるので、この中に記述しているaddGestureRecognizer が実行され、ジェスチャーが登録されます。 あなたの場合 let pimage = Pimage() でPimageを生成しようとしているので その場合、 init() { super.init(frame: CGRectZero) } を実装すればエラーは出なくなりますが、 このままではaddGestureRecognizerは実行されません。 init(coder aDecoder: NSCoder)と同じように、 init()の中にaddGestureRecognizerを追加すれば ジェスチャーが登録されると思います。 うまく動かないときは、実装したコードがちゃんと意図通りに 動作しているか、ブレークポイントで止めながら、 1ステップずつ実行状況を確認することをお勧めします。

dkong
質問者

お礼

度重なる質問へ回答ありがとうございます。教えていただいたようにすると、ジェスチャーがとれるようになりました。毎回丁寧な回答ありがとうございます。

その他の回答 (3)

回答No.3

> privateは参考にしたコードのままでよくわかってません。 privateメソッドをaction:のセレクタに指定すると 実行時にエラーになると思ったんですけど出ませんでしたか? private func Pinch(gesture:UIPinchGestureRecognizer){ じゃなくて func Pinch(gesture:UIPinchGestureRecognizer){ とする必要があるように思うのですが。 http://swift-studying.com/blog/swift/?p=544 の例を見ても、action:に指定しているhandleGestureメソッドは func handleGesture(gesture: UIGestureRecognizer){ と定義されており、privateになっていません。 この例のpinchメソッドは同じクラス内のhandleGestureからしか 呼ばれないのでprivateメソッドで問題ないですけど。 参考にしているコードがWebサイトで公開されているものなら そのURLを示してどんなコードを見たのか明らかにした方が 適切なアドバイスを得やすいと思います。

dkong
質問者

お礼

何度もありとうございます。ご指摘いただいたサイトと同じサイトを参考にしています。 http://swift-studying.com/blog/swift/?p=544

dkong
質問者

補足

このサイトのコードをそのまま実装すると、Missing argument for parameter 'coder' in callというエラーがでます。そこで教えていただいたように init() { super.init(frame: CGRectZero) } でエラーはなくなりました。しかしジェスチャーが動きませんでした。 質問するために短くして投稿していましたが、余計にややこしくしていました。申し訳ないです。重ねた画像をこのサイトのように動かしたり、拡大縮小させるにはどうしたらいいのでしょうか。 let pimage = Pimage()でPimageインスタンスを作成して pimage.image = imageArray[indexPath.row]でpimageにインデックスパスから配列にある画像を設定しています。

回答No.2

> ピンチジェスチャーの部分を追加してみたのですが、ジェスチャーが取れていないのですが、どのようにすればいいのでしょうか? 「ジェスチャーが取れない」というのが、具体的に何をしたらどうなるのか(エラーが発生するのか、エラーが発生するならどのようなメッセージが出るのか)という現象をちゃんと説明してもらわないと分かりませんが、 気になるのは > private func Pinch(gesture:UIPanGestureRecognizer){ のところで、 ・privateメソッドにしている ・UIPanGestureRecognizerにしている という点です。

dkong
質問者

お礼

追加の質問にも回答ありとうございます。

dkong
質問者

補足

パンジェスチャー、ピンチジェスチャーを実装したいのですが、うまくいかず、一つずつ試していて、質問のところにコピペする部分を間違えました。エラーがでているわけではないのですが、まずピンチジェスチャーを感知したら、デバッグ出力し、きちんと感知しているかを試そうとしています。重ねて表示された画像をパンしてもピンチしてもデバッグ出力されないので、パンジェスチャー、ピンチジェスチャーがきちんと感知されてないのかと思っているのですが、分かりません。privateは参考にしたコードのままでよくわかってません。よろしくお願いします。 import UIKit class Pimage: UIImageView { init() { super.init(frame: CGRectZero) } var gestureEnabled = true private var beforePoint = CGPointMake(0.0, 0.0) private var currentScale:CGFloat = 1.0 required init(coder aDecoder: NSCoder) { super.init(coder: aDecoder) self.userInteractionEnabled = true let pinchGesture = UIPinchGestureRecognizer(target: self, action: "Pinch:") self.addGestureRecognizer(pinchGesture) } } ///////ピンチジェスチャー////////// private func Pinch(gesture:UIPinchGestureRecognizer){    println("ピンチジェスチャー ")   }

回答No.1

結論としては http://qiita.com/tkuma/items/0187f819e49c47bb9873 を参考にして、 init() { super.init(frame: CGRectZero) } を追加すればよいです。 なぜこうしなければならないかは、 http://tea-leaves.jp/swift/content/%E3%82%A4%E3%83%8B%E3%82%B7%E3%83%A3%E3%83%A9%E3%82%A4%E3%82%B6 とかを読んで ・指定イニシャライザ(designated initializer) ・コンビニエンスイニシャライザ(convenience initializer) ・必須イニシャライザ(required initializer) を理解する必要があります。

dkong
質問者

お礼

回答ありとうございます。教えていただいたように init() { super.init(frame: CGRectZero) } を追加すると、エラーが消えました。 指定イニシャライザ・コンビニエンスイニシャライザ・必須イニシャライザ について勉強します。ありとうございました。

dkong
質問者

補足

画像の上にPimageを重ねてピンチで拡大縮小しようとしてるのですが、教えていただいたようにするとエラーは消えま、Pimageは重ねられるようになりました。ピンチジェスチャーの部分を追加してみたのですが、ジェスチャーが取れていないのですが、どのようにすればいいのでしょうか? CGRectZeroの部分をサイズを与えるようにしないといけないのでしょうか? import UIKit class Pimage: UIImageView { init() { super.init(frame: CGRectZero) } var gestureEnabled = true private var beforePoint = CGPointMake(0.0, 0.0) private var currentScale:CGFloat = 1.0 required init(coder aDecoder: NSCoder) { super.init(coder: aDecoder) self.userInteractionEnabled = true let pinchGesture = UIPinchGestureRecognizer(target: self, action: "Pinch:") self.addGestureRecognizer(pinchGesture) } } ///////ピンチジェスチャー////////// private func Pinch(gesture:UIPanGestureRecognizer){    println("ピンチジェスチャー ")   }

関連するQ&A