web-dev-qa-db-ja.com

GestureRecognizerがタップに応答しない

UIImageViewのサブクラスによる初期化の後、次のコード行があります。

self.userInteractionEnabled = true
self.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "handleTap:"))

必要な関連関数を作成しました:

func handleTap(gestureRecognizer: UITapGestureRecognizer) {
    print("In handler")
}

問題のビューをタップすると、「Inハンドラーがコンソールに出力されなかった」。次に、ハンドラー関数を削除して、コンパイラーが関数の欠落について文句を言うかどうかを確認しました。しませんでした。

私は前向きに困惑しています。どんな軽い人でもこれを当てることができれば本当にありがたいです。

更新:私のクラスは、実際にはUIImageViewではなくUIViewです

51
Didia

コードを注意深く調べた結果、答えが見つかりました。

frame:を指定せずに、親ビューの1つが作成されました

この質問の削除を正当化するのに十分なエラーではありませんが、将来、他の誰かが同じ問題を抱えることになる可能性があります...

14
Didia

Storyboardを使用してUITapGestureRecognizerに配置したUILabelを使用していました。

これを機能させるには、ストーリーボードのUILabel Attributes Inspectorで「User Interaction Enabled」というラベルの付いたブロックにチェックマークを付ける必要がありました。

enter image description here

118
Scooter

これを試して

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    self.view.userInteractionEnabled = true
    var tapGesture = UITapGestureRecognizer(target: self, action: Selector("handleTap:"))
    self.view.addGestureRecognizer(tapGesture)
}

func handleTap(sender : UIView) {
    println("Tap Gesture recognized")
}
14

ほとんどの場合、UIGestureRecognizerを間違った場所に追加します。 UIViewstoryboardを使用した作業サンプルです。 UIViewを動的に作成する場合、この初期化を正しいコンストラクターに配置する必要があります。

class TestView: UIView
{
    override func awakeFromNib()
    {
        self.userInteractionEnabled = true
        self.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "handleTap:"))
    }

    func handleTap(gestureRecognizer: UITapGestureRecognizer)
    {
        println("Here")
    }
}
7
Vitaly

他の回答に加えて、これはジェスチャ認識機能を複数のビューに追加することで発生する可能性があります。ジェスチャレコグナイザーは、シングルビュー専用です。

参照: https://stackoverflow.com/a/5567684/654302

6
bradkratky

私はプログラムの観点からこの問題に遭遇しました。

ジェスチャレコグナイザーを使用したUIViewには.isUserInteractionEnabled = trueがありましたが、親ビューにも.isUserInteractionEnabled = trueを設定するまでタップに応答しませんでした。

4
mattdedek

試行錯誤の末、この問題の解決策を見つけました。したがって、2つのソリューション2つがあります

1。 viewDidLoad()にGestureRecognizerを追加し、userInteractionEnabled = trueをオンにします

2。計算されたプロパティを使用する場合、プロパティにletの代わりにlazy varを使用します。

lazy var profileImageView: UIImageView = {
    let iv = UIImageView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
    iv.image = #imageLiteral(resourceName: "gameofthrones_splash")
    iv.contentMode = .scaleAspectFill
    iv.translatesAutoresizingMaskIntoConstraints = false
    iv.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleSelectProfileImageView)))
    iv.isUserInteractionEnabled = true
    return iv
}()
2
Mayank Wadhwa

このコードはXCode 7.0.1で動作します

import UIKit

class ImageView: UIImageView {

    init(frame: CGRect, sender: Bool, myImage: UIImage) {
        super.init(frame: frame)
        self.image = myImage
        initBorderStyle(sender)

        // enable user interaction on image.
        self.userInteractionEnabled = true
        let gesture = UITapGestureRecognizer(target: self, action: "previewImage:")
        addGestureRecognizer(gesture)

    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    func previewImage(myGesture: UITapGestureRecognizer? = nil) {
        print("i'm clicked")
    }

    private func initBorderStyle(sender: Bool) {
        self.layer.masksToBounds = true
        self.layer.cornerRadius = 8
        self.layer.borderWidth = 0.5
        self.layer.borderColor = getBorderColor(sender)
        self.backgroundColor = getColor(sender)
    }


    func getBorderColor(sender: Bool) -> CGColor {
        var result: CGColor
        if sender {
            result = UIColor(red: 0.374, green: 0.78125, blue: 0.0234375, alpha: 0.5).CGColor
        } else {
            result = UIColor(red: 0.3125, green: 0.6015625, blue: 0.828125, alpha: 0.5).CGColor
        }
        return result
    }
}
1
Tarek

通常のクラスであり、UIViewなどのサブクラスではないため、私のジェスチャーは機能しませんでした。

この通常のクラスのインスタンスを持っているUIViewのサブクラスを作成することで問題を解決し、その中にジェスチャーロジックを配置しました。

0
George_E