2011-02-15 23 views
17

Tengo un UILongPressGestureRecognizer agregado a un UIButton. Cuando presiono el botón UIB, se resalta como se esperaba. Sin embargo, cuando se llama al selector UILongPressGestureRecognizer, el resaltado se desactiva.UILongPressGestureRecognizer desactiva UIButton Highlighting

UILongPressGestureRecognizer *longpressGesture = 
    [[UILongPressGestureRecognizer alloc] initWithTarget:self 
              action:@selector(longPressHandler:)]; 
    longpressGesture.minimumPressDuration = 5; 
    [longpressGesture setDelegate:self]; 
    [self.myUIButton addGestureRecognizer:longpressGesture]; 
    [longpressGesture release]; 

    - (void)longPressHandler:(UILongPressGestureRecognizer *)gestureRecognizer { 
    NSLog(@"longPressHandler"); 
} 

En el ejemplo anterior, se llama al selector después de 5 segundos de mantener presionado el botón. El botón se resalta antes de que se llame al selector, pero luego no se resalta cuando se llama al selector, aunque sigo presionando el botón.

¿Alguien puede explicar por qué sucede esto y cómo se puede prevenir? Me gustaría que el botón permanezca resaltado todo el tiempo mientras se presiona hacia abajo. Gracias.

Respuesta

37

Después de seguir investigando, descubrí que esto se debe al comportamiento predeterminado de Reconocedores de gestos, que cancelan los toques en la jerarquía una vez que reconocen un gesto. Entonces, una vez que el Reconocedor de gestos reconoce un gesto, cancela el toque al Botón de la interfaz de usuario, que luego no se ilumina, ya que ya no tiene un evento táctil.

Este comportamiento se puede cambiar mediante el cancelsTouchesInView propiedad

longpressGesture.cancelsTouchesInView = NO; 

Poner No pasará el contacto a través de la cadena de respuesta.

+0

Pero llamará al selector para touchUpInside. ¿Cómo prevenir eso? – user1010819

0

Esto es algo especulativo ..: Sospecho que el disparo del GestureRecognizer está tomando los botones en la cadena de respuesta, lo que hace que pierda el foco. No se me ocurre ninguna forma de evitar esto, pero puede haber algunas soluciones:

  • en el método del controlador de prensas largas manipule el botón para continuar mostrando el estado de prensado. Esta es una forma muy sucia de hacer esto.
  • no utilice el reconocedor de gestos. En cambio, inmediatamente cuando se presiona el botón crea un temporizador que después de 5 segundos llama a un selector. Si el botón se está liberando antes de que haya transcurrido el tiempo, simplemente invalide el temporizador. Esta debería ser una solución más "limpia", sin embargo, si está decidido a usar el reconocedor de gestos, esto no ayudará.