J'ai besoin d'implémenter une fonctionnalité qui invoquera du code lorsque je tapotai deux fois sur self.view (vue de UIViewCotroller
). Mais le problème est que j'ai un autre objet d'interface utilisateur sur cette vue et que je ne veux pas attacher d'objet de reconnaissance à tous. J'ai trouvé cette méthode ci-dessous comment faire un geste sur ma vue et je sais comment cela fonctionne. En ce moment, je suis devant un handicap pour choisir la manière de créer ce module de reconnaissance en ignorant la sous-vue. Des idées? Merci.
UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTap:)];
[doubleTap setNumberOfTapsRequired:2];
[self.view addGestureRecognizer:doubleTap];
ios
uitapgesturerecognizer
Matrosov Alexander
la source
la source
Réponses:
Vous devez adopter le
UIGestureRecognizerDelegate
protocole à l'intérieur de l'self
objet et appeler la méthode ci-dessous pour vérifier la vue. Dans cette méthode, comparez votre vuetouch.view
et renvoyez la valeur booléenne appropriée (Oui / Non). Quelque chose comme ça:Edit: S'il vous plaît, vérifiez également la réponse de @ Ian!
Swift 5
la source
-[UIGestureRecognizer requireGestureRecognizerToFail:]
fouillez dans leursif
test échoue, votre implémentation ne renvoie pas un BOOL; pour un style correct, retournez YES après un bloc if (en utilisant{ }
) ou dans uneelse
branche. Merci, cependant, m'a sauvé un peu de lecture.Une autre approche consiste simplement à comparer si la vue du toucher est la vue des gestes, car les descendants ne passeront pas la condition. Un monoplace simple et agréable:
la source
Et pour la variante Swift:
Bon à savoir,
isDescendantOfView
renvoie uneBoolean
valeur indiquant si le récepteur est une sous-vue d'une vue donnée ou identique à cette vue.la source
Avec Swift 5 et iOS 12,
UIGestureRecognizerDelegate
a une méthode appeléegestureRecognizer(_:shouldReceive:)
.gestureRecognizer(_:shouldReceive:)
a la déclaration suivante:Le code complet ci-dessous montre une implémentation possible pour
gestureRecognizer(_:shouldReceive:)
. Avec ce code, un tap sur une sous-vue de laViewController
vue de (y comprisimageView
) ne déclenchera pas laprintHello(_:)
méthode.Une autre implémentation de
gestureRecognizer(_:shouldReceive:)
peut être:Notez cependant que ce code alternatif ne vérifie pas s'il
touch.view
s'agit d'une sous-vue degestureRecognizer.view
.la source
Solution rapide complète (le délégué doit être implémenté ET défini pour le ou les reconnaisseurs):
la source
Variante utilisant CGPoint que vous touchez (SWIFT 4.0)
la source
Effacer la voie rapide
la source
Notez que l' API gestureRecognizer est devenue :
gestureRecognizer (_: shouldReceive :)
Notez en particulier l'indicateur de soulignement (saut) pour l'étiquette externe du premier paramètre.
En utilisant plusieurs des exemples fournis ci-dessus, je n'ai pas reçu l'événement. Ci-dessous, un exemple qui fonctionne pour les versions actuelles de Swift (3+).
la source
En plus des solutions ci-dessus, n'oubliez pas de vérifier
User Interaction Enabled
votre sous-vue.la source
J'ai dû empêcher le geste sur la vue enfant. La seule chose qui a fonctionné est d'autoriser et de conserver la première vue et d'empêcher les gestes dans toutes les vues suivantes:
la source
Swift 4:
touch.view
est désormais optionnel, donc basé sur la réponse de @ Antoine:la source
Si vous ne voulez pas que votre « recogniser double tap » en conflit avec vos boutons et / ou d' autres contrôles, vous pouvez définir
self
commeUIGestureRecognizerDelegate
et mettre en œuvre:la source