Necesito implementar una función que invocará algún código cuando toque dos veces en self.view (vista de UIViewCotroller
). Pero el problema de que tengo otro objeto de IU en esta vista y no quiero adjuntar ningún objeto de reconocimiento a todos ellos. Encontré este método a continuación sobre cómo hacer gestos en mi vista y sé cómo funciona. En este momento estoy frente a la desventaja de qué manera elegir para crear este reconocedor ignorando la subvista. ¿Algunas ideas? Gracias.
UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTap:)];
[doubleTap setNumberOfTapsRequired:2];
[self.view addGestureRecognizer:doubleTap];
ios
uitapgesturerecognizer
Alejandro Matrosov
fuente
fuente
Respuestas:
Debe adoptar el
UIGestureRecognizerDelegate
protocolo dentro delself
objeto y llamar al método siguiente para verificar la vista. Dentro de este método, verifique su vistatouch.view
y devuelva el bool apropiado (Sí / No). Algo como esto:Editar: ¡Por favor, también revisa la respuesta de @ Ian!
Rápido 5
fuente
-[UIGestureRecognizer requireGestureRecognizerToFail:]
busque en susif
prueba falla, su implementación no devuelve un BOOL; para un estilo adecuado, devuelva YES después de un bloque if (usando{ }
) o en unaelse
rama. Gracias, sin embargo, me salvó un poco de lectura.Otro enfoque es simplemente comparar si la vista del tacto es la vista de gestos, porque los descendientes no pasarán la condición. Una bonita y simple frase:
fuente
Y para la variante Swift:
Es bueno saberlo,
isDescendantOfView
devuelve unBoolean
valor que indica si el receptor es una subvista de una vista determinada o es idéntico a esa vista.fuente
Con Swift 5 y iOS 12,
UIGestureRecognizerDelegate
tiene un método llamadogestureRecognizer(_:shouldReceive:)
.gestureRecognizer(_:shouldReceive:)
tiene la siguiente declaración:El código completo a continuación muestra una posible implementación para
gestureRecognizer(_:shouldReceive:)
. Con este código, un toque en una subvista de laViewController
vista de '(incluidaimageView
) no activará elprintHello(_:)
método.Una implementación alternativa de
gestureRecognizer(_:shouldReceive:)
puede ser:Sin embargo,
touch.view
tenga en cuenta que este código alternativo no comprueba si es una subvista degestureRecognizer.view
.fuente
Solución rápida completa (el delegado debe implementarse Y configurarse para reconocedores):
fuente
Variante con CGPoint que toca (SWIFT 4.0)
fuente
Camino rápido y despejado
fuente
Tenga en cuenta que la API de gestosRecognizer ha cambiado a:
gestoRecognizer (_: shouldReceive :)
Preste especial atención al indicador de subrayado (omisión) de la etiqueta externa del primer parámetro.
Utilizando muchos de los ejemplos proporcionados anteriormente, no recibí el evento. A continuación se muestra un ejemplo que funciona para las versiones actuales de Swift (3+).
fuente
Además de las soluciones anteriores, no olvide verificar
User Interaction Enabled
su vista secundaria.fuente
Tuve que evitar el gesto en la vista infantil. Lo único que funcionó es permitir y mantener la primera vista y evitar gestos en todas las siguientes vistas:
fuente
Rápido 4:
touch.view
ahora es opcional, por lo que se basa en la respuesta de @ Antoine:fuente
Si no quiere que su 'reconocedor doble toque' al conflicto con sus botones y / u otros controles, se puede establecer
self
comoUIGestureRecognizerDelegate
y poner en práctica:fuente