J'ai une vue (parent
) avec deux sous-vues, une sur le dessus (topChild
) de l'autre (bottomChild
).Sous-vue frère ne reçoit pas touche dans iPhone
Si je tape sur l'écran seulement topChild
et parent
recevoir l'événement tactile.
Que dois-je modifier pour propager l'événement tactile à bottomChild
?
Le code:
- (void)viewDidLoad
{
[super viewDidLoad];
MYView* parent = [[MYView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
parent.tag = 3;
parent.backgroundColor = [UIColor redColor];
MYView* bottomChild = [[MYView alloc] initWithFrame:CGRectMake(0, 0, 90, 90)];
bottomChild.tag = 2;
bottomChild.backgroundColor = [UIColor blueColor];
[parent addSubview:bottomChild];
MYView* topChild = [[MYView alloc] initWithFrame:CGRectMake(0, 0, 80, 80)];
topChild.tag = 1;
topChild.backgroundColor = [UIColor greenColor];
[parent addSubview:topChild];
[self.view addSubview:parent];
}
Où MYView
est une sous-classe de UIView
qui se connecte uniquement touchesBegan
.
- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
NSLog(@"%d", self.tag);
[super touchesBegan:touches withEvent:event];
}
Le résultat:
Toucher la zone verte produit le journal suivant:
TouchTest[25062:f803] 1
TouchTest[25062:f803] 3
Ma première idée était de faire parent
propager tous les touchesSomething
appels à ses enfants mais (A) Je soupçonne qu'il pourrait y avoir une solution plus facile n et (B) Je ne sais pas quel enfant a envoyé l'événement à parent, et envoyer des messages touchesSomething
deux fois à la même vue peut provoquer des shenanigans.
Après avoir posé la question j'ai trouvé ce post qui suggère d'outrepasser hitTest
pour changer la vue qui reçoit les touches. Je vais essayer cette approche et mettre à jour la question si cela fonctionne.
Merci Adam! Cette solution serait-elle compatible avec les reconnaisseurs de gestes?À première vue, il me semble que je devrai réimplémenter la roue si je vais dans cette direction. – hpique
Et j'aimerais beaucoup restructurer les choses, mais je ne vois pas comment dans mon cas. topChild a la transparence, topChild et bottomChild peuvent "se déplacer" (ainsi topChild ne peut pas être une sous-vue de bottomChild), et les deux doivent répondre aux touches. – hpique
Il devrait être possible, vous passeriez juste l'objet gestureRecognizer reçu par le rappel au parent plutôt qu'un simple contact. Au moins dans le projet que j'ai à portée de main cela fonctionnerait pour UIPinchGestureRecognizer. –