2017-10-13 8 views
0

Je réponds à la question ci-dessus lorsque je fais face à un contact en dehors de la bordure de la vue spécifiée. La solution que je trouve sur le site me dit de passer outre hitTest: l'événement: méthode comme ceci:Pourquoi appeler le hitTest de super ne provoque pas de boucle infinie?

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { 
UIView *view = [super hitTest:point withEvent:event]; 
if (view == nil) { 
    for (UIView *subView in self.subviews) { 
     CGPoint tp = [subView convertPoint:point fromView:self]; 
     if (CGRectContainsPoint(subView.bounds, tp)) { 
      view = subView; 
     } 
    } 
} 
return view; 

}

J'ai remarqué que dans la première ligne que l'auteur appelle [super hitTest:point withEvent:event], et je suis aussi au courant que le test de succès est récursif. Donc, le super doit appeler la méthode hitTest de la sous-vue et la dernière appellera super à nouveau. Je me demande juste pourquoi cela ne cause pas de boucle infinie? Merci!

+0

De même que viewDidLoad() ne provoque pas de boucle infinie. –

+0

Ne mélangez-vous pas sub ** views ** et sub ** classes **? –

+0

Merci. J'ai vraiment mal compris le point. J'ai simplement mélangé super et superView. Désolé pour ça. – Stephen

Répondre

0

Vous le comprenez mal, super n'appelle pas hitTest méthode sur les sous-vues, il appelle pointInside méthode. De documentation:

Cette méthode parcourt la hiérarchie des vues en appelant le pointInside: withEvent: méthode de chaque sous-vue de déterminer qui devrait recevoir sous-vue d'un événement tactile.

Espérons que ça aide!