Esta cita será responder a su pregunta de por qué se comporta de esa manera:
Touch events. El objeto ventana utiliza la prueba de aciertos y la cadena de respuesta para encontrar la vista que recibirá el evento táctil. En la prueba de aciertos, una ventana llama a HitTest: withEvent: en la vista superior de la jerarquía de vistas; este método procede llamando recursivamente a pointInside: withEvent: en cada vista en la jerarquía de vista que devuelve SÍ, avanzando hacia abajo en la jerarquía hasta que encuentra la subvista dentro de cuyos límites se realizó el toque. Esa vista se convierte en la vista de prueba de golpe. (source)
Una solución es crear su propio UITapInSubviewsView
con la siguiente definición para hitTest
:
(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
NSEnumerator *reverseE = [self.subviews reverseObjectEnumerator];
UIView *iSubView;
while ((iSubView = [reverseE nextObject])) {
UIView *viewWasHit = [iSubView hitTest:[self convertPoint:point toView:iSubView] withEvent:event];
if(viewWasHit)
return viewWasHit;
}
return [super hitTest:point withEvent:event];
}
continuación, utiliza esta clase para su vista padre.
(Encontré este código en una publicación de S.O. hace algunas semanas, pero parece que ya no puedo encontrarlo, así que simplemente lo copié de mi proyecto).
¿Puede ampliar la respuesta un poco sobre la causa de esto? ¿Es porque la prueba de impacto predeterminada ignora los toques fuera de los límites de la vista principal? ¿Y necesito probarme a mí mismo si el toque está dentro de los límites de los niños? – Jaanus