Question GestureRecognizer ne répond pas au tap


Après initialisation de par 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, "In handler 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. Ce n'était pas le cas.

Je suis positivement déconcerté. J'apprécierais vraiment n'importe quelle lumière que les gens peuvent jeter à ce sujet.

Mettre à jour: Ma classe est en fait un UIImageView par opposition à UIView


33
2017-09-25 00:07


origine


Réponses:


J'utilisais UITapGestureRecognizer que j'ai placé sur un UILabel en utilisant Storyboard.

Pour que cela fonctionne, je devais aussi cocher la case "Interaction utilisateur activée" dans le bloc. UILabel Attributs Inspecteur dans le Storyboard.

enter image description here


93
2017-11-28 00:50



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

Une des vues parentes a été créée sans fournir de frame:

Bien qu'il soit une erreur assez de noobish pour justifier la suppression de ces questions, les chances sont que quelqu'un d'autre aura également le même problème à l'avenir ...


9
2017-10-13 16:00



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

8
2017-09-25 07:04



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

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

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

5
2017-09-25 03:03



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

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


4
2018-01-02 05:30



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

1. Soit ajouter le GestureRecognizer dans viewDidLoad () et tourner     userInteractionEnabled = true

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

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
}()

0
2018-03-26 15:45



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
2017-10-19 20:21