2012-09-05 18 views
8

Supongamos que actualmente estoy siguiendo un gesto de arrastre. En mi controlador de eventos utilizo un umbral para determinar cuándo el arrastre resulta en una acción. Cuando se cruza el umbral, quiero indicar que el gesto de arrastre se ha completado.¿Cómo finalizo/reinicié un UIGestureRecognizer mediante programación?

La única cosa que puedo encontrar en la documentación es esta línea here:

Si cambia esta propiedad en NO, mientras que un reconocedor gesto es reconociendo actualmente un gesto, las transiciones gesto reconocedor un cancelados estado.

Así:

if (translation.y > 100) { 
    // do action 
    [self doAction]; 

    //end recognizer 
    sender.enabled = NO; 
    sender.enabled = YES; 
} 

Esto funciona, pero parece que puede haber una manera más ordenada.

¿Alguien sabe de otra manera de indicar que un gesto ha terminado programáticamente? Esperaría algo así como un método -end: que genere un evento final con el estado UIGestureRecognizerStateEnded.

+0

¿Puedes describir qué haces con el gesto de arrastre? ¿Estás realmente arrastrando algo? –

+0

Hola, Fábio, sí, estoy arrastrando horizontalmente, digo una página de un libro virtual, cuando se pasa el umbral, comienzo la animación para voltear una página y luego quiero terminar el gesto de arrastre prematuramente para que un evento con estado UIGestureRecognizerStateEnded sea generado, manejando todas las acciones asociadas con el final regular de este gesto. – Mattijs

Respuesta

7

¿Ha definido un UIGestureRecognizer personalizado? Si el gesto que está reconociendo es diferente de los estándares definidos por Apple porque tiene un umbral diferente o no es lo mismo que un UIPanGestureRecognizer regular, entonces podría tener sentido crear su propio UIGestureRecognizer. (see subclassing notes)

Si ha subclase UIGestureRecognizer, sólo tiene que establecer el estado de la siguiente manera:

self.state = UIGestureRecognizerStateEnded; 

es probable que desee hacer esto en el touchesMoved: withEvent: método. También tenga en cuenta:

"Las subclases de UIGestureRecognizer deben importar UIGestureRecognizerSubclass.h. Este archivo de encabezado contiene una redeclaración de estado que lo convierte en lectura-escritura."

Por otro lado, si solo está implementando un UIGestureRecognizerDelegate, el estado es de solo lectura y no hay forma de establecerlo directamente. En ese caso, su método de deshabilitar/habilitar podría ser lo mejor que puede hacer.

+0

Subclassing es la respuesta aquí para hacer una implementación ordenada. No lo pensé de esta manera. ¡Gracias! – Mattijs

3

Con el código que mostró necesita tener la lógica para iniciar la animación cuando se cancela el reconocedor de gestos y yo diría que esto no es bueno ya que hay otras maneras en que este reconocedor de gestos puede cancelarse sin querer tener la animación hecha

Considerando que tiene un método para iniciar la animación, solo necesita llamar a este método cuando se pasa el umbral y cuando el gesto finaliza normalmente. Dos ocasiones diferentes entonces. El código que presentará sería el siguiente:

if (translation.y > 100) { 
    // do action 
    [self finishFlip]; 
    sender.enabled = NO; 
    sender.enabled = YES; 
} 

cancelando el gesto aquí puede ser útil también si eso impide cualquier acción siguientes si el usuario mantiene arrastrando su dedo.

Si tiene un equipo que se está desarrollando sobre esto y necesita que ocurra un evento específico, debe subclasificar el reconocedor de gestos como no sugerido.

Cuestiones relacionadas