edo1z blog

プログラミングなどに関するブログです

Xcode7 - Swift2 UIImageViewのタッチイベントを検知する

Xcode 7.0.1 Swift 2.0

ボタンだと、下記のようにできます。

self.myButton.addTarget(self, action: "onClickMyButton:", forControlEvents: .TouchUpInside)

UIImageViewだと、addTargetは使えません。

参考:SwiftにてUIImageViewをTap検知後、詳細画面に遷移したい

上記を参考に、下記のように作成してみましたが、エラーはでませんが、検知しません。

let gesture = UITapGestureRecognizer(target:self, action: "onTouchImg:")
imgView.addGestureRecognizer(gesture)

func onTouchImg(recognizer: UITapGestureRecognizer){
    print("touched!")
}

touchesBeganを使って座標で計算しようかなと思いまして、下記をとりあえずつくりましたが、これも反応しません。

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    super.touchesBegan(touches, withEvent:event)
    print("123")
}

参考:UILABELやUIIMAGEVIEWが応答しない場合の対処法

userInteractionEnabledはUIViewクラスのプロパティで、デフォルトではNOらしい。これをtrueにしないと反応しないらしい。

imgView.userInteractionEnabled = true

上記を追加したが、反応しない。

どうも、UIScrollViewを使っていることが原因っぽい。UIScrollViewを外すと反応する。

参考:UILabel・UIImageViewでタッチイベントを拾う方法の例外

しかし 「UIScrollViewの上に乗っているUILabeやUIImageView」 の場合は、 タップしてもtouchesBeganメソッドやtouchesEndedメソッドが反応しない。 (UIScrollViewのtouchesBegan/touchesEndedメソッドの実装によるものと推測)

UIScrollView上にある、UIImageViewとかUILabelのタッチイベントを検知するには、UITapGestureRecognizerを使い、対象のviewのuserInteractionEnabledをtureにしたら反応した。