Pregunta ¿Cómo activar UITapGestureRecognizer en una vista secundaria parcialmente recortada por la vista principal?


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.

Observado: la UITGR se activa cuando hago clic en la parte de B que está dentro de los límites de A. La UITGR NO se activa cuando hago clic en la parte de B que está fuera de los límites de A.

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


5
2018-05-07 04:07


origen


Respuestas:


Esta cita responderá a su pregunta en cuanto a por qué se comporta asi

Eventos táctiles. El objeto de la ventana utiliza la prueba de aciertos y la cadena de respuesta para encontrar la vista para 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 éxito.   (fuente)

Una solución es crear tu 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];
}

Luego usas esta clase para tu vista principal.

(Encontré este código en una publicación de S.O. hace unas semanas, pero parece que no puedo encontrarlo más, así que simplemente lo copié de mi proyecto).


6
2018-05-17 08:31



Tienes que escribir tu propia función hittest para la vista A.

También mira esta pregunta: UITapGestureRecognizer no se activa en una búsqueda profunda


0
2018-05-16 14:38