web-dev-qa-db-fra.com

GestureRecognizer ne répond pas au tap

Après l'initialisation de la sous-classe de UIImageView, j'ai la ligne de code suivante:

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

J'ai créé la fonction associée nécessaire:

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

En tapant sur la vue en question, "Dans le gestionnaire n'a jamais été imprimé sur la console". J'ai ensuite supprimé la fonction de gestionnaire pour voir si le compilateur se plaindrait de la fonction manquante. Ça n'a pas.

Je suis vraiment perplexe. J'apprécierais vraiment toute lumière que les gens peuvent apporter à ce sujet.

Mise à jour : Ma classe est en fait une UIImageView par opposition à UIView

45
Didia

J'ai découvert la réponse après avoir soigneusement examiné mon code.

Une des vues parent a été créée sans fournir un frame:

Bien que ce soit une erreur assez noble pour justifier la suppression de cette question, il est fort probable que quelqu'un d'autre aura également le même problème à l'avenir ...

11
Didia

J'utilisais UITapGestureRecognizer que j'avais placé sur UILabel à l'aide de Storyboard.

Pour que cela fonctionne, je devais également cocher la case "Interaction utilisateur activée" dans l'inspecteur Attributs UILabel du Storyboard.

 enter image description here

105
Scooter

Essaye ça

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")
}
13

Très probablement, vous ajoutez UIGestureRecognizer au mauvais endroit. Voici un exemple de travail avec UIView de storyboard. Si vous créez votre UIView de manière dynamique, vous devez placer cette initialisation dans le constructeur approprié.

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

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

En plus des autres réponses, cela peut être provoqué par l'ajout de la reconnaissance de mouvements à plusieurs vues. Les identificateurs de gestes sont destinés à des vues uniques.

Référence: https://stackoverflow.com/a/5567684/6543020

6
bradkratky

J'ai rencontré ce problème avec des vues programmatiques.

Mon UIView avec la reconnaissance de geste avait .isUserInteractionEnabled = true, mais il n'a pas répondu aux tap jusqu'à ce que je règle également .isUserInteractionEnabled = true pour ses vues parent.

3
mattdedek

J'ai trouvé la solution à ce problème après de nombreux essais et erreurs. Donc, il y a deux solution deux ce

1. Ajoutez la GestureRecognizer dans viewDidLoad () et activez userInteractionEnabled = true

2. Si vous utilisez la propriété calculée, utilisez lazy var au lieu de let.

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
}()
1
Mayank Wadhwa

Ce code fonctionne pour moi avec 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
    }
}
0
Tarek