Mon problème: j'ai un superview EditView
qui occupe essentiellement tout le cadre de l'application, et une sous-vue MenuView
qui ne prend que les ~ 20% inférieurs, puis MenuView
contient sa propre sous-vue ButtonView
qui réside en fait en dehors des limites de MenuView
's (quelque chose comme ceci :) ButtonView.frame.origin.y = -100
.
(Remarque: EditView
a d'autres sous-vues qui ne font pas partie de MenuView
la hiérarchie des vues de, mais peuvent affecter la réponse.)
Vous connaissez probablement déjà le problème: quand ButtonView
est dans les limites de MenuView
(ou, plus précisément, lorsque mes touches sont dans MenuView
les limites de), ButtonView
répond aux événements tactiles. Lorsque mes touches sont en dehors des limites de MenuView
's (mais toujours dans ButtonView
les limites de'), aucun événement tactile n'est reçu par ButtonView
.
Exemple:
- (E) est
EditView
le parent de toutes les vues - (M) est
MenuView
une sous-vue de EditView - (B) est
ButtonView
une sous-vue de MenuView
Diagramme:
+------------------------------+
|E |
| |
| |
| |
| |
|+-----+ |
||B | |
|+-----+ |
|+----------------------------+|
||M ||
|| ||
|+----------------------------+|
+------------------------------+
Parce que (B) est en dehors du cadre de (M), un tap dans la région (B) ne sera jamais envoyé à (M) - en fait, (M) n'analyse jamais le toucher dans ce cas, et le toucher est envoyé à l'objet suivant dans la hiérarchie.
Objectif: je hitTest:withEvent:
crois comprendre que le dépassement peut résoudre ce problème, mais je ne comprends pas exactement comment. Dans mon cas, doit-il hitTest:withEvent:
être remplacé dans EditView
(mon superview «maître»)? Ou devrait-il être remplacé dans MenuView
la vue directe du bouton qui ne reçoit pas de touches? Ou est-ce que je pense mal à cela?
Si cela nécessite une longue explication, une bonne ressource en ligne serait utile - à l'exception des documents UIView d'Apple, qui ne m'ont pas été clairs.
Merci!
la source
Ok, j'ai fait des recherches et des tests, voici comment
hitTest:withEvent
fonctionne - au moins à un niveau élevé. Imaginez ce scénario:Diagramme:
Parce que (B) est en dehors du cadre de (M), un tap dans la région (B) ne sera jamais envoyé à (M) - en fait, (M) n'analyse jamais le toucher dans ce cas, et le toucher est envoyé à l'objet suivant dans la hiérarchie.
Cependant, si vous implémentez
hitTest:withEvent:
dans (M), les taps n'importe où dans l'application seront envoyés à (M) (ou du moins il les connaît). Vous pouvez écrire du code pour gérer le toucher dans ce cas et renvoyer l'objet qui devrait recevoir le toucher.Plus précisément: le but de
hitTest:withEvent:
est de renvoyer l'objet qui devrait recevoir le hit. Donc, dans (M), vous pouvez écrire du code comme celui-ci:Je suis encore très nouveau dans cette méthode et ce problème, donc s'il existe des moyens plus efficaces ou plus corrects d'écrire le code, veuillez commenter.
J'espère que cela aidera quiconque abordera cette question plus tard. :)
la source
Dans Swift 5
la source
Ce que je ferais, c'est que ButtonView et MenuView existent au même niveau dans la hiérarchie des vues en les plaçant tous les deux dans un conteneur dont le cadre s'adapte complètement aux deux. De cette façon, la région interactive de l'élément découpé ne sera pas ignorée en raison des limites de la vue supervisée.
la source
Si vous avez de nombreuses autres sous-vues dans votre vue parent, alors la plupart des autres vues interactives ne fonctionneraient probablement pas si vous utilisez les solutions ci-dessus, dans ce cas, vous pouvez utiliser quelque chose comme ceci (dans Swift 3.2):
la source
Si quelqu'un en a besoin, voici l'alternative rapide
la source
Placez sous les lignes de code dans votre hiérarchie de vues:
Pour plus de précision, il a été expliqué dans mon blog: "goaheadwithiphonetech" concernant "Légende personnalisée: le bouton n'est pas cliquable".
J'espère que cela vous aide ... !!!
la source