Digamos que tenemos un controlador de vista con una vista secundaria. la subvista ocupa el centro de la pantalla con márgenes de 100 px en todos los lados. Luego agregamos un montón de pequeñas cosas para hacer clic dentro de esa subvista. Solo estamos usando la subvista para aprovechar el nuevo marco (x = 0, y = 0 dentro de la subvista es en realidad 100,100 en la vista principal).
Luego, imagine que tenemos algo detrás de la subvista, como un menú. Quiero que el usuario pueda seleccionar cualquiera de las "pequeñas cosas" en la subvista, pero si no hay nada allí, quiero que pasen toques (ya que el fondo está claro de todos modos) a los botones detrás de él.
¿Cómo puedo hacer esto? Parece que comienza a tocar, pero los botones no funcionan.
ios
objective-c
iphone
cocoa-touch
ipad
Sean Clark Hess
fuente
fuente
UIButton
que está debajo de un semitransparente,UIView
mientras que la parte no transparente de laUIView
respuesta seguirá respondiendo a eventos táctiles.Respuestas:
Cree una vista personalizada para su contenedor y anule el mensaje pointInside: para devolver false cuando el punto no está dentro de una vista secundaria elegible, como esta:
Rápido:
C objetivo:
El uso de esta vista como contenedor permitirá que cualquiera de sus hijos reciba toques, pero la vista en sí misma será transparente para los eventos.
fuente
Yo tambien uso
No hay necesidad de subclase. Funciona bien.
fuente
De Apple:
Las mejores prácticas de manzanas :
en su lugar, puede anular:
en su subclase UIView y devuelva NO si desea que ese toque se envíe a la cadena de respuesta (IE a las vistas detrás de su vista sin nada en él).
fuente
NO
;Una forma mucho más simple es "Desmarcar" la interacción del usuario habilitada en el generador de interfaces. "Si estás usando un guión gráfico"
fuente
Sobre la base de lo que John publicó, aquí hay un ejemplo que permitirá que los eventos táctiles pasen por todas las subvistas de una vista, excepto los botones:
fuente
UIView
subclasePassThroughView
que simplemente se anule-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { return YES; }
si desea reenviar cualquier evento táctil debajo de las vistas.Últimamente escribí una clase que me ayudará con eso. Usarlo como una clase personalizada para
UIButton
oUIView
pasará eventos táctiles que se ejecutaron en un píxel transparente.Esta solución es algo mejor que la respuesta aceptada porque aún puede hacer clic en una
UIButton
que está debajo de un semitransparente,UIView
mientras que la parte no transparente de laUIView
respuesta seguirá respondiendo a eventos táctiles.Como puede ver en el GIF, el botón Giraffe es un rectángulo simple, pero los eventos táctiles en áreas transparentes se pasan al amarillo
UIButton
debajo.Enlace a clase
fuente
La solución más votada no funcionaba completamente para mí, supongo que era porque tenía un TabBarController en la jerarquía (como señala uno de los comentarios), de hecho, estaba pasando toques a algunas partes de la interfaz de usuario, pero estaba jugando con mi La capacidad de tableView para interceptar eventos táctiles, lo que finalmente hizo fue anular hitTest en la vista. Quiero ignorar los toques y dejar que las subvistas de esa vista los manejen.
fuente
Swift 3
fuente
De acuerdo con la 'Guía de programación de aplicaciones de iPhone':
http://developer.apple.com/iphone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/EventHandling/EventHandling.html
Actualizado : ejemplo eliminado - releer la pregunta ...
¿Tiene algún procesamiento de gestos en las vistas que pueden estar procesando los toques antes de que el botón lo obtenga? ¿Funciona el botón cuando no tienes una vista transparente sobre él?
¿Alguna muestra de código de código que no funciona?
fuente
Hasta donde yo sé, se supone que puedes hacer esto anulando el método hitTest . Lo intenté pero no pude hacerlo funcionar correctamente.
Al final, creé una serie de vistas transparentes alrededor del objeto táctil para que no lo cubrieran. Un poco hack para mi problema esto funcionó bien.
fuente
Tomando consejos de las otras respuestas y leyendo la documentación de Apple, creé esta biblioteca simple para resolver su problema:
https://github.com/natrosoft/NATouchThroughView
Hace que sea fácil dibujar vistas en Interface Builder que deberían pasar por toques Una vista subyacente.
Creo que el intercambio de métodos es excesivo y muy peligroso de hacer en el código de producción porque estás jugando directamente con la implementación base de Apple y haciendo un cambio en toda la aplicación que podría causar consecuencias no deseadas.
Hay un proyecto de demostración y es de esperar que el archivo README haga un buen trabajo explicando qué hacer. Para abordar el OP, debe cambiar la clara UIView que contiene los botones para clasificar NATouchThroughView en Interface Builder. Luego, busque la clara UIView que se superpone al menú que desea que se pueda tocar. Cambie esa UIView a la clase NARootTouchThroughView en Interface Builder. Incluso puede ser la UIView raíz de su controlador de vista si desea que esos toques pasen al controlador de vista subyacente. Echa un vistazo al proyecto de demostración para ver cómo funciona. Es realmente bastante simple, seguro y no invasivo.
fuente
Creé una categoría para hacer esto.
un pequeño método swizzling y la vista es dorada.
El encabezado
El archivo de implementación
Deberá agregar mi Swizz.h y Swizz.m
ubicado aquí
Después de eso, solo importa el UIView + PassthroughParent.h en su archivo {Project} -Prefix.pch, y cada vista tendrá esta capacidad.
cada vista tomará puntos, pero ninguno del espacio en blanco lo hará.
También recomiendo usar un fondo claro.
EDITAR
Creé mi propia bolsa de propiedades, y eso no estaba incluido anteriormente.
Archivo de cabecera
Archivo de implementacion
fuente
pointInside: withEvent:
?Si no puede molestarse en usar una categoría o subclase de UIView, también puede llevar el botón hacia adelante para que esté frente a la vista transparente. Esto no siempre será posible dependiendo de su aplicación, pero funcionó para mí. Siempre puede volver a traer el botón u ocultarlo.
fuente
Prueba esto
fuente
Intenta establecer uno
backgroundColor
de tustransparentView
comoUIColor(white:0.000, alpha:0.020)
. Luego puede obtener eventos táctiles entouchesBegan
/touchesMoved
métodos. Coloque el código a continuación en algún lugar donde se inicie su vista:fuente
Lo uso en lugar del punto de método de anulación (dentro: CGPoint, con: UIEvent)
fuente