2012-05-07 10 views
5

Configuración: tengo la vista principal A. Tiene una vista secundaria B. B está parcialmente dentro de los límites de A, pero parcialmente afuera (A tiene clipsToBounds = falso). He adjuntado UITapGestureRecognizer (UITGR) a B.Cómo iniciar UITapGestureRecognizer en una vista secundaria que está parcialmente recortada por la vista principal?

Observado: UITGR activa OK cuando toco la parte de B que está dentro de los límites de A. UITGR NO se activa cuando toco la parte de B que está afuera los límites de A.

Esperado/pregunta: ¿Cómo disparo la UITGR cuando toco la parte de B que está fuera de los límites de A?

Respuesta

6

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).

0

usted tiene que escribir su propia función hittest de vista A.

también mirar a esta pregunta: UITapGestureRecognizer not triggered in deep view hiearchy

+0

¿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

Cuestiones relacionadas