Comment ignorer les événements tactiles et de les transmettre à un autre sous-vue du UIControl objets?
J'ai un custom UIViewController dont UIView prend un coin de l'écran, mais la plupart de celui-ci est transparent sauf pour les parties qui ont des boutons et des trucs sur elle. En raison de la disposition des objets sur ce point de vue, le point de vue de l'image peuvent recouvrir des boutons en dessous. Je veux être en mesure d'ignorer tout touche à ce point de vue s'ils ne sont pas toucher quoi que ce soit d'important sur lui, mais il me semble seulement être en mesure de passer le long de réels événements tactiles (touchesEnded/nextResponder genre de trucs). Si j'ai un UIButton ou quelque chose comme ça qui ne marche pas utiliser touchesEnded, comment puis-je passer l'événement tactile le long de qui?
Je ne peux pas juste manuellement figure bouton sélecteur pour appeler, parce que cette coutume ViewController peut être utilisé sur de nombreux points de vue différents. J'ai essentiellement besoin d'un moyen d'appeler cela:
[self.nextResponder touchesEnded:touches withEvent:event];
sur UIControl types ainsi.
Vous devez vous connecter pour publier un commentaire.
Probablement la meilleure façon de le faire est de remplacer
hitTest:withEvent:
dans la vue que vous souhaitez ignorer touche. Selon la complexité de votre point de vue de la hiérarchie, il ya un couple de façons simples de le faire.Si vous avez une référence à la vue sous le point de vue de l'ignorer:
Si vous n'avez pas de référence à la vue:
Je recommande la première approche est la plus robuste (si c'est possible d'obtenir une référence pour la vision sous-jacente).
.h
et.m
fichier traîner avec très peu de code, mais il va faire le travail. En outre, un relais de vue est utile pour la sous-classe à avoir dans votre trousse à outils. Si votre vue-contrôleur crée la vue dans unnib
, juste d'aller dans l'IB fichier et de modifier la vue de la classe à votre nouvelle sous-classe de l'identité de l'inspecteur. Si c'est créé par programmation, puis de créer et affecter votre vue de la sous-classe dansloadView
(voir edit).hitTest:withEvent:
) pour décider si une vue doit recevoir touche à tout, mais l'utilisation de modules de reconnaissance de geste de distinguer entre les différents types de toucher.if hitView is UIControl
pour tester si le coup était sur une touche (n'importe quel type de contrôle). Si je rentre donc le point de vue contraire, le retournil
pour passer le contact par le biais de.Réponse rapide:
Vous pouvez créer une sous-classe UIView, IgnoreTouchView. Dans un storyboard, réglez-le sur la VC de la vue(s) vous voulez passer par des touches:
Notez que vous devez définir UserInteractionEnabled de vrai, pour le UIView en question!
Je n'ai pas trouvé un bon moyen de passer le UITouch événements entre les objets. Ce qui fonctionne généralement mieux est de mettre en œuvre hitTest et retourner nil si le point n'est pas dans la vue que vous souhaitez manipuler:
Vous pouvez également désactiver l'interaction de l'utilisateur, de sorte que les événements tactiles sont ignorés et sont transmis à la société mère.
Dans Swift:
C'est une vieille question, et elle revient en haut de recherches. Donc, je pensais que je poste une autre solution qui pourrait fonctionner mieux pour votre situation. Dans mon cas, je voulais faire glisser une étiquette sur le dessus de l'autre de l'étiquette et je voulais avoir l'étiquette ci-dessous dans le hitTest. La chose la plus simple à faire est de régler la
userInteractionEnabled
àNO
oufalse
, puis faire votre hitTest, puis retournez à nouveau si vous avez besoin de se déplacer à nouveau. Voici un exemple de code dans Swift:Mon problème est similaire: j'ai eu un UIControl complexes toucher les intervenants, mais il a agi drôle lorsqu'il est incorporé dans un rouleau de vue...
Cela empêche les parents de défilement (ou peut être modifié afin de prévenir d'autres interactions) lorsque le sous affichage a un toucher actif geste.
Ma solution:
Créer un délégué protocole pour didBeginInteraction et didEndInteraction dans la sous-vue.
Appel délégué.didBeginInteraction de touchesBegan
Appel délégué.didEndInteraction de touchesEnded et touchesCancelled
Dans le contrôleur de parent, de mettre en œuvre didBegin et didEnd protocole, ensemble délégué
Puis définissez le scrollView.scrollEnabled = NO dans didBegin, scrollEnabled = OUI dans didEnd.
Espère que cela aide quelqu'un avec un peu différente en cas d'utilisation de la question posée!