1
votes

UIGesturerecognizer ne fonctionne pas sur UIView

Lorsque j'appuie sur UIView mais que Gesture ne fonctionne pas.

override func viewDidLoad() {
        super.viewDidLoad()

        let tap = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))
        viewForSHadow.isUserInteractionEnabled = true
        viewForSHadow.addGestureRecognizer(tap)

        // Do any additional setup after loading the view.
    }


func handleTap(_sender: UITapGestureRecognizer) {
        print("---------View Tapped--------")
        viewForSHadow.isHidden = true
        viewForAlert.isHidden = true
    }

Je veux simplement effectuer cette action sur UIView, appuyez sur.


6 commentaires

combien de fois tu as appuyé sur le geste


avez-vous une ImageView au-dessus de la vue ou quelque chose qui peut consommer le geste?


Où avez-vous ajouté viewForSHadow et quelles sont les contraintes que vous avez ajoutées?


Il est dans la vue principale et le montre - le cache.


une fois que vous aurez tapé, votre vue masquera ce qui semble dans votre code. donc votre robinet ne fonctionne que pour la première fois


@Coding a essayé une fois de mettre du code dans viewWillAppear () et de vérifier, s'il ne fonctionne pas, partager les détails de viewForSHadow comment vous l'avez initialisé.


6 Réponses :


1
votes

Vous devez implémenter comme suit:

    class ViewController: UIViewController, UIGestureRecognizerDelegate {

...

    override func viewDidLoad() {
        super.viewDidLoad()
        let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap(_sender:)))
        viewForSHadow.isUserInteractionEnabled = true
        viewForSHadow.addGestureRecognizer(tap)
    }

    @objc func handleTap(_sender: UITapGestureRecognizer) {
        print("---------View Tapped--------")
        viewForSHadow.isHidden = true
        viewForAlert.isHidden = true
    }
...

}


6 commentaires

à quoi sert le délégué ici et voyez-vous le code une fois que vous avez appuyé sur le geste, masquez le viewForSHadow.isHidden = true


le délégué n'est pas du tout nécessaire ici!


Oui, le délégué n'est pas requis. @ Anbu.Karthik Je viens d'utiliser le code de Coding pour faire fonctionner le geste du robinet.


@BhavikModi - mais si l'utilisateur cliquait sur la vue, il masquait la propre vue


@ Anbu.Karthik Nous ne savons pas ce que veut exactement Coding :) Vous pouvez lui demander directement.


Qu'est-ce que vous avez essayé et qu'est-ce qui ne fonctionne pas? J'ai déjà testé cela et fonctionne bien.



1
votes

Votre code est plus que suffisant pour que UIGestureRecognizer fonctionne, vous devriez vérifier d'autres choses comme, y a-t-il quelque chose d'autre qui peut consommer l'interaction de l'utilisateur. Et aussi pour vérifier si vous utilisez

isUserInteractionEnabled = false

à une vue parente de viewForSHadow.


0 commentaires

0
votes

Vous devez mentionner la propriété numberOfTapsRequired de UITapGestureRecognizer.

override func viewDidLoad() {
    super.viewDidLoad()
    let tap = UITapGestureRecognizer(target: self, action: #selector(handleTapGesture(_sender:)))
    tap.numberOfTapsRequired = 1
    viewForSHadow.isUserInteractionEnabled = true
    viewForSHadow.addGestureRecognizer(tap)
}

@objc func handleTapGesture(_sender: UITapGestureRecognizer) {
    print("---------View Tapped--------")
    // Why are you hiding this view **viewForSHadow**
    viewForSHadow.isHidden = true
    viewForAlert.isHidden = true
}

De plus, assurez-vous que vous ne faites pas viewForSHadow .isUserInteractionEnabled = false n'importe où dans le code.


2 commentaires

désolé, pas d'accord avec vous, numberOfTapRequired a la valeur par défaut 1, c'est la raison pour laquelle cela ne peut pas être le problème. developer.apple.com/documentation/uikit/uitapgesturerecogniz‌ er /…


Pouvez-vous vérifier si vous ne faites pas viewForSHadow.isUserInteractionEnabled = false n'importe où?



3
votes

Vous pouvez vérifier dans la hiérarchie des vues de débogage si quelque chose avec alpha = 0 chevauche votre viewForSHadow .


0 commentaires

0
votes

Tout d'abord, votre code ne compile pas. La signature handleTap (_ :) doit être comme:

class ViewController: UIViewController {
    @IBOutlet weak var viewForSHadow: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()
        let tap = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))
        viewForSHadow.addGestureRecognizer(tap)
    }

    @objc func handleTap(_ sender: UITapGestureRecognizer) {
        print("---------View Tapped--------")
    }
}

Deuxièmement, vous devez d'abord essayer avec le code minimal dans un projet séparé. Et par code minimal, je veux dire ce que vous avez ajouté dans la question.

@objc func handleTap(_ sender: UITapGestureRecognizer) {
    print("---------View Tapped--------")
}

Essayez avec juste le code ci-dessus et voyez si vous pouvez le faire fonctionner. Le code ci-dessus fonctionne bien de mon côté sans aucun délégué ou numberOfTaps.


0 commentaires