Pasar eventos táctiles al hermano correspondiente UIViews


12

Estoy tratando de manejar eventos táctiles con touchesBegan en una superposición a uno de los padres UIView pero también permitir que la entrada táctil pase al hermano UIView s debajo. Esperaba que hubiera una manera directa de procesar un evento táctil y luego decir "ahora enviarlo al siguiente respondedor como si este no existiera", pero todo lo que puedo encontrar es el método nextResponder que parece estar dando volver al padre a mi vista de superposición. Ese padre no está pasando realmente al siguiente hermano de esa vista de superposición, así que estoy atascado sin saber cómo hacer lo que parece una tarea simple que normalmente se realiza con una devolución de llamada táctil que obtiene un valor de retorno verdadero o falso para contarlo si continuar procesando la jerarquía de widgets.

¿Me falta algo obvio?

3

Última respuesta, pero creo que sería mejor que omita hitTest:withEvent: en lugar de touchesBegan. Me parece que touchesBegan es un método bastante "de alto nivel" que está ahí para simplemente hacer algo simple, por lo que no se puede alterar a ese nivel si el evento se propaga más. El lugar correcto para hacerlo es hitTest:withEvent:.

También eche un vistazo a this S.O. answer para obtener más detalles sobre este punto.


1

Entiendo el comportamiento deseado que está buscando Joey: No he encontrado algo en la API que admita este comportamiento de mensajería instantánea con vistas de hermanos.

Lo que originalmente escribí a continuación fue con respecto a informar a un padre UIView acerca de un toque. Esto sigue siendo válido, pero creo que es necesario dar un paso más y hacer que el padre UIView use la técnica de prueba de impacto que Sergio describió en cada una de sus subvistas que son hermanas de la superposición, y hacer que el padre UIView invoque manualmente un "do algo "método en cada una de sus subvistas que pasan la prueba de acierto. Cada una de esas vistas de hermanos puede devolver un valor BOOL sobre si se cancela informar a otros hermanos o continuar la cadena.

Si observa que usa mucho este patrón, considere agregar un método de categoría en UIView que encapsule las pruebas de detección de impactos y solicite a las vistas que realicen un selector.

Mi respuesta original

Con un poco de trabajo manual, puede cablear esta junto a ti mismo. Tuve que hacer esto, y funcionó para mí, porque tenía un caso de uso muy repetido (una vista de superposición en un botón), donde tenía sentido crear algunas clases personalizadas. Si su situación es similar, una de estas técnicas será suficiente.

Opción 1: Si la cubierta no tiene que hacer nada más que mirar bastante, tienen que optar por no manejar por completo con userInteractionEnabled = NO táctil. Esto hará que el evento táctil se dirija a su UIView padre (sobre el cual está una superposición).

Opción 2: Tener la superposición de absorber el evento táctil (como lo haría por defecto), y luego invocar un método en el UIView matriz que indica que se reconoció un toque o determinado gesto, y esto es lo que es. De esta forma, la UIView que está detrás de la superposición aún actúa sobre el reconocimiento táctil, incluso si alguien más realizó la intercepción.

Con la opción 2, es más adecuado para tipos simples UIControlEvent, como UIControlEventTouchDown y UIControlEventTouchUpInside.En mi caso (una subclase personalizada UIButton con una vista de superposición personalizada en la parte superior), voy a cablear tocar hacia abajo y retocar eventos en el botón a dos métodos separados. Se activan si se produce un evento de tocar hacia abajo o retocar dentro del botón. Pero, también son ganchos que puedo invocar desde la vista de superposición si necesito simular que se produjo la pulsación de un botón.

Dependiendo de sus necesidades, usted podría tener un protocolo conocido entre la superposición y es UIView padres o simplemente tener la superposición de probar la UIView de manera informal, con un cheque respondsToSelector: antes de invocar performSelector: en él con el método personalizado que desea llamada que haría se han disparado automáticamente si UIView no estaba cubierto por una superposición.