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
UIGestureRecognizerDelegateprotocolo dentro delselfobjeto y llamar al método siguiente para verificar la vista. Dentro de este método, verifique su vistatouch.viewy 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 susifprueba falla, su implementación no devuelve un BOOL; para un estilo adecuado, devuelva YES después de un bloque if (usando{ }) o en unaelserama. 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,
isDescendantOfViewdevuelve unBooleanvalor 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,
UIGestureRecognizerDelegatetiene 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 laViewControllervista de '(incluidaimageView) no activará elprintHello(_:)método.Una implementación alternativa de
gestureRecognizer(_:shouldReceive:)puede ser:Sin embargo,
touch.viewtenga 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 Enabledsu 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.viewahora 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
selfcomoUIGestureRecognizerDelegatey poner en práctica:fuente