Il existe plusieurs façons vous pouvez gérer cela. Mon préféré est de remplacer hitTest:withEvent: dans une vue est une commune superview (peut-être indirectement) pour les points de vue contradictoires (on dirait que vous appelez ces A et B). Par exemple, quelque chose comme ceci (ici A et B sont UIView pointeurs, où B est le "caché", qui est normalement pris en compte):
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
CGPoint pointInB = [B convertPoint:point fromView:self];
if ([B pointInside:pointInB withEvent:event])
return B;
return [super hitTest:point withEvent:event];
}
Vous pouvez également modifier l' pointInside:withEvent:
méthode gyim suggéré. Cela vous permet d'obtenir essentiellement le même résultat en "piquer un trou" dans Un, au moins pour la touche finale.
Une autre approche est le réacheminement d'événement, ce qui signifie primordial touchesBegan:withEvent:
et des méthodes similaires (comme touchesMoved:withEvent:
etc) pour envoyer quelques touches à un objet différent de celui où ils ont d'abord aller. Par exemple, dans Un, vous pouvez écrire quelque chose comme ceci:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
if ([self shouldForwardTouches:touches]) {
[B touchesBegan:touches withEvent:event];
}
else {
// Do whatever A does with touches.
}
}
Toutefois, cela ne fonctionne pas toujours comme vous le souhaitez! La chose principale est que des contrôles intégrés comme UIButton toujours ignorer transmis touche. De ce fait, la première approche est plus fiable.
Il y a un bon billet de blog expliquant tout cela plus en détail, avec un petit travail xcode projet de démonstration les idées, disponible ici:
http://bynomial.com/blog/?p=74