Transmettre des événements tactiles aux frères et sœurs UIViews


12

J'essaie de gérer les événements tactiles avec touchesBegan dans une superposition vers un parent UIView mais également de laisser l'entrée tactile passer à UIView sbling below. Je m'attendais à ce qu'il y ait un moyen simple de traiter un événement tactile et ensuite de dire "maintenant l'envoyer au prochain répondant comme si celui-ci n'existait pas", mais tout ce que je peux trouver est la méthode nextResponder qui semble donner retourner le parent à ma vue de superposition. Ce parent ne le passe pas vraiment sur le frère suivant de cette vue de superposition, donc je suis incertain de la façon de faire ce qui semble être une tâche simple qui est généralement accomplie avec un rappel tactile qui obtient une valeur de retour vrai ou faux pour le dire s'il faut continuer à traiter la hiérarchie du widget.

Est-ce que quelque chose me manque?

3

Réponse tardive, mais je pense que vous feriez mieux de passer outre hitTest:withEvent: au lieu de touchesBegan. Il me semble que touchesBegan est une méthode assez «de haut niveau» qui est là pour faire une chose simple, donc vous ne pouvez pas modifier à ce niveau si l'événement est propagé plus loin. Le bon endroit pour le faire est hitTest:withEvent:.

Jetez également un oeil à this S.O. answer pour plus de détails sur ce point.


1

Je comprends le comportement souhaité que vous recherchez Joey - Je n'ai pas trouvé quelque chose dans l'API qui supporte ce comportement de messagerie automatique avec les fratries. Ce que j'ai écrit à l'origine ci-dessous concernait simplement le fait d'informer un parent UIView d'un contact. Cela s'applique toujours, mais je crois que vous devez aller plus loin et faire en sorte que le parent UIView utilise la technique de test de hit décrite par Sergio sur chacune de ses sous-vues qui sont des frères et sœurs à la superposition. quelque chose "méthode sur chacune de ses sous-vues qui passent le test de succès. Chacune de ces vues peut renvoyer une valeur BOOL sur l'abandon de l'information d'autres frères ou la poursuite de la chaîne.

Si vous utilisez souvent ce modèle, pensez à ajouter une méthode de catégorie sur UIView qui encapsule les tests de hit et demande aux vues d'effectuer un sélecteur.

Mon originale réponse

Avec un peu de travail manuel, vous pouvez câbler cette ensemble vous-même. J'ai dû faire cela, et cela a fonctionné pour moi, parce que j'avais un cas d'utilisation souvent répété (une vue de superposition sur un bouton), où il était logique de créer des classes personnalisées. Si votre situation est similaire, l'une de ces techniques suffira.

Option 1: Si la superposition n'a pas besoin de faire quoi que ce soit, mais joli, faites-le retirer de contact avec la manipulation complètement userInteractionEnabled = NO. Cela fera en sorte que l'événement tactile va à son parent UIView (celui auquel il est superposé).

Option 2: Avoir la superposition d'absorber l'événement tactile (comme il le ferait par défaut), et invoque ensuite une méthode sur la UIView mère indiquant qu'une touche ou certains geste a été reconnu, et voilà ce qu'il est. De cette façon, l'UIView derrière la superposition peut toujours agir sur la reconnaissance tactile, même si quelqu'un d'autre a fait l'interception.

Avec l'option 2, il convient plutôt aux types UIControlEvent simples, tels que UIControlEventTouchDown et UIControlEventTouchUpInside.Dans mon cas (une sous-classe UIButton personnalisée avec une vue de superposition personnalisée sur le dessus), je vais câbler toucher et retoucher des événements sur le bouton à deux méthodes distinctes. Ceux-ci tirent si un contact ou une retouche à l'intérieur de l'événement se produit sur le bouton lui-même. Mais, ils sont également des crochets que je peux invoquer à partir de la vue de superposition si j'ai besoin de simuler qu'une pression sur un bouton s'est produite.

En fonction de vos besoins, vous pourriez avoir un protocole connu entre la superposition et il est UIView parent ou tout simplement avoir la superposition tester la UIView manière informelle, avec un chèque respondsToSelector: avant d'invoquer performSelector: dessus avec la méthode personnalisée que vous voulez appelé qui serait ont tiré automatiquement si le UIView n'était pas couvert par une superposition.