Tengo vista con a UITapGestureRecognizer
. Entonces, cuando toco la vista, aparece otra vista encima de esta vista. Esta nueva vista tiene tres botones. Cuando ahora presiono uno de estos botones, no obtengo la acción de los botones, solo obtengo la acción del gesto de tocar. Así que ya no puedo usar estos botones. ¿Qué puedo hacer para que los eventos lleguen a estos botones? Lo extraño es que los botones aún se resaltan.
No puedo simplemente eliminar el UITapGestureRecognizer después de recibir su toque. Porque con ella también se puede eliminar la nueva vista. Significa que quiero un comportamiento como los controles de video de pantalla completa .
void
que no deje ninguna información en el tiempo de ejecución para su detección. Pero lo que puede hacer es subir la jerarquía de vista, probarUIControl
y regresarNO
si encuentra algún control.Como seguimiento al seguimiento de Casey a la respuesta de Kevin Ballard:
Básicamente, esto hace que funcionen todos los tipos de controles de entrada de usuario, como botones, controles deslizantes, etc.
fuente
setCancelsTouchesInView = NO
para no activar el gesto de toque en la interacción con los controles. Sin embargo, puede escribirlo mejor:return ![touch.view isKindOfClass:[UIControl class]];
Encontré esta respuesta aquí: enlace
También puedes usar
Lo que evita que el reconocedor de grifos sea el único en atrapar todos los grifos
ACTUALIZACIÓN: Michael mencionó el enlace a la documentación que describe esta propiedad: cancelsTouchesInView
fuente
Como seguimiento a la respuesta de Kevin Ballard, tuve el mismo problema y terminé usando este código:
Tiene el mismo efecto, pero esto funcionará en cualquier UIButton a cualquier profundidad de vista (mi UIButton tenía varias vistas de profundidad y el delegado de UIGestureRecognizer no tenía una referencia).
fuente
En iOS 6.0 y versiones posteriores, las acciones de control predeterminadas evitan la superposición del comportamiento del reconocedor de gestos. Por ejemplo, la acción predeterminada para un botón es un solo toque. Si tiene un único reconocedor de gestos de toque conectado a la vista principal de un botón y el usuario toca el botón, entonces el método de acción del botón recibe el evento táctil en lugar del reconocedor de gestos. Esto se aplica solo al reconocimiento de gestos que se superpone a la acción predeterminada para un control, que incluye: .....
Del documento API de Apple
fuente
Estas respuestas fueron incompletas. Tuve que leer varias publicaciones sobre cómo usar esta operación booleana.
En su archivo * .h agregue esto
En su archivo * .m agregue esto
fuente
Encontré otra forma de hacerlo desde aquí . Detecta el toque ya sea dentro de cada botón o no.
(1) pointInside: withEvent: (2) locationInView:
fuente
Aquí está la versión Swift de la respuesta de Lily Ballard que funcionó para mí:
fuente
Swift 5
Botón en supervista con tapgesture
En mi caso, implementar hitTest funcionó para mí. Tenía vista de colección con botón
Este método atraviesa la jerarquía de vistas llamando al
point(inside:with:)
método de cada subvista para determinar qué subvista debería recibir un evento táctil. Sipoint(inside:with:)
devuelve verdadero, la jerarquía de la subvista se recorre de manera similar hasta que se encuentra la vista frontal que contiene el punto especificado.fuente
Puede evitar que UITapGestureRecognizer cancele otros eventos (como tocar el botón) configurando el siguiente valor booleano:
fuente
Si su escenario es así:
Tiene una vista simple y algunos botones UIB, controles UITextField agregados como subvistas a esa vista. Ahora desea descartar el teclado cuando toca en cualquier otro lugar de la vista, excepto en los controles (subvistas que agregó)
Entonces la solución es:
Agregue el siguiente método a su XYZViewController.m (que tiene su vista)
fuente
Optimizando la respuesta de Cdasher, obtienes
fuente