Tengo una vista superpuesta sobre muchas otras vistas. Solo estoy usando el modo general para detectar algunos toques en la pantalla, pero aparte de eso, no quiero que la vista detenga el comportamiento de otras vistas debajo, que son vistas de desplazamiento, etc. ¿Cómo puedo reenviar todos los toques? esta vista superpuesta? Es un subcalso de UIView.
141
Respuestas:
¡Desactivar la interacción del usuario era todo lo que necesitaba!
C objetivo:
Rápido:
fuente
myWebView.isUserInteractionEnabled = false
Para pasar toques desde una vista superpuesta a las vistas debajo, implemente el siguiente método en la vista UIV:
C objetivo:
Swift 5:
fuente
Este es un hilo viejo, pero surgió en una búsqueda, así que pensé en agregar mi 2c. Tengo una UIView de cobertura con subvistas, y solo quiero interceptar los toques que golpean una de las subvistas, así que modifiqué la respuesta de PixelCloudSt a
fuente
Versión mejorada de @fresidue answer. Puede usar esta
UIView
subclase como vista transparente pasando toques fuera de su subvista. Implementación en Objective-C :.
y en Swift:
PROPINA:
Supongamos que tiene un panel grande de "soporte", tal vez con una vista de tabla detrás. Usted hace el panel "titular"
PassthroughView
. Ahora funcionará, puede desplazarse por la tabla "a través" del "titular".¡Pero!
En la parte superior del panel "titular" tiene algunas etiquetas o iconos. No se olvide, por supuesto, esos deben simplemente estar marcados. La interacción del usuario está habilitada.
En la parte superior del panel "titular" tiene algunos botones. No se olvide, por supuesto, ¡esos deben estar marcados como la interacción del usuario habilitada ENCENDIDA!
Nota que tanto confusa, el "titular" en sí - la vista se utiliza
PassthroughView
en - la interacción del usuario debe estar marcado activado EN ! Eso está encendido ! (De lo contrario, el código en PassthroughView simplemente nunca se llamará).fuente
$0.isUserInteractionEnabled
Tuve un problema similar con un UIStackView (pero podría ser cualquier otra vista). Mi configuración fue la siguiente:
Es un caso clásico en el que tengo un contenedor que debía colocarse en el fondo, con botones a los lados. Para fines de diseño, incluí los botones en un UIStackView, pero ahora la parte central (vacía) de la pilaView intercepta toques :-(
Lo que hice fue crear una subclase de UIStackView con una propiedad que define la subvista que debería ser tocable. Ahora, cualquier toque en los botones laterales (incluido en la matriz * viewsWithActiveTouch *) se dará a los botones, mientras que cualquier toque en la vista de pila en cualquier otro lugar que no sea estas vistas no se interceptará y, por lo tanto, se pasará a lo que esté debajo de la pila ver.
fuente
Si la vista a la que desea reenviar los toques no es una subvista / supervista, puede configurar una propiedad personalizada en su subclase UIView de la siguiente manera:
Asegúrate de sintetizarlo en tu .m:
Y luego incluya lo siguiente en cualquiera de sus métodos de UIResponder como:
Donde quiera que instale su UIView, configure la propiedad forwardableTouchee en la vista a la que desea que se reenvíen los eventos:
fuente
En Swift 5
fuente
Necesitaba pasar toques a través de un UIStackView. Un UIView dentro era transparente, pero el UIStackView consumió todos los toques. Esto funcionó para mí:
Todas las Subvistas organizadas todavía reciben toques, pero los toques en el UIStackView mismo pasaron a la vista a continuación (para mí, un mapView).
fuente
Parece que incluso si tienes bastantes respuestas aquí, no hay nadie limpio en la rapidez que necesitaba. Así que tomé la respuesta de @fresidue aquí y la convertí en rápida, ya que es lo que ahora la mayoría de los desarrolladores quieren usar aquí.
Solucionó mi problema donde tengo una barra de herramientas transparente con botón, pero quiero que la barra de herramientas sea invisible para el usuario y que los eventos táctiles deberían pasar.
isUserInteractionEnabled = false ya que algunos declararon que no es una opción basada en mis pruebas.
fuente
Tenía un par de etiquetas dentro de StackView y no tuve mucho éxito con las soluciones anteriores, en su lugar resolví mi problema usando el siguiente código:
Subclases UIStackView:
Entonces podrías hacer algo como:
fuente
Intenta algo como esto ...
El código anterior, en su método touchesBegan, por ejemplo, pasaría los toques a todas las subvistas de vista.
fuente
La situación que intentaba hacer era construir un panel de control usando controles dentro de UIStackView anidados. Algunos de los controles tenían otros de UITextField con UIButton. Además, había etiquetas para identificar los controles. Lo que quería hacer era poner un gran botón "invisible" detrás del panel de control para que si un usuario tocaba un área fuera de un botón o campo de texto, pudiera atraparlo y tomar medidas, principalmente descartar cualquier teclado si aparece un texto el campo estaba activo (resignFirstResponder). Sin embargo, al tocar una etiqueta u otra área en blanco en el panel de control no pasaría nada. Las discusiones anteriores fueron útiles para llegar a mi respuesta a continuación.
Básicamente, subclasifiqué UIStackView y sobrescribí la rutina "point (inside: with) para buscar el tipo de controles que necesitaban tocar e" ignorar "cosas como etiquetas que quería ignorar. También verifica el interior de UIStackView para que las cosas puedan repetirse en la estructura del panel de control.
El código es quizás un poco más detallado de lo que debería ser. Pero fue útil para la depuración y, con suerte, proporciona más claridad sobre lo que está haciendo la rutina. Solo asegúrese de que en Interface Builder cambie la clase de UIStackView's a PassThruStack.
}
fuente
Según lo sugerido por @PixelCloudStv si desea lanzar tocado de una vista a otra pero con un control adicional sobre este proceso - subclase UIView
//encabezamiento
//implementación
Después en interfaceBuilder, simplemente establezca la clase de Vista en TouchView y configure el rect activo con su rect. También puedes cambiar e implementar otra lógica.
fuente