2011-11-23 11 views
8

Tengo un montón de UIButton s dentro de un UIView dentro de un UIScrollView. Estoy tratando de agregar un reconocedor de tap a la vista de desplazamiento. El reconocedor de tap activa, pero ahora ninguno de mis botones funciona.iOS5 UITapRecognizer para UIScrollView interfiere con los botones. ¿Como arreglar?

Sé que en iOS5, UIScrollView de alguna manera puede pasar un evento táctil a la jerarquía de control después de haber terminado con él. ¿Alguien puede ayudarme a descubrir cómo hacer esto?

Respuesta

15

Establezca la propiedad UIGestureRecognizercancelsTouchesInView en NO.

UITapGestureRecognizer *singleTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self 
                          action:@selector(singleTap:)]; 
singleTapGestureRecognizer.numberOfTapsRequired = 1; 
singleTapGestureRecognizer.enabled = YES; 
singleTapGestureRecognizer.cancelsTouchesInView = NO; 
[tapableView addGestureRecognizer:singleTapGestureRecognizer]; 
[singleTapGestureRecognizer release]; 

De UIGestureRecognizer Class Reference

Un valor booleano que afecta a si toques se entregados a una vista cuando se reconoce un gesto.

Cuando esta propiedad es SI (el valor predeterminado) y el receptor reconoce su gesto, los toques de ese gesto que son pendiente no se entregan a la vista y previamente entregado toques se cancelan a través de un touchesCancelled: withEvent: mensaje enviado a la vista. Si un reconocedor de gestos no reconoce su gesto o si el valor de esta propiedad es NO, la vista recibe todos los toques en la secuencia multitáctil .

+1

exactamente lo que necesitaba, gracias por una respuesta rápida! :) –

+0

Esto ocasiona que el botón Y el reconocedor de gestos se disparen ... – hfossli

+0

@hfossli correcto. – Till

0

También puede utilizar el método de la UIGestureRecognizerDelegate, que se documenta heregestureRecognizer:shouldReceiveTouch:, para obtener el mismo resultado. Ofrece un poco más de flexibilidad, por ejemplo, si desea cancelar ciertos toques, pero no otros. He aquí un ejemplo,

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 
{ 
    if ([touch.view.superview isKindOfClass:[UIButton class]]) return NO; 

    return YES; 
} 
+0

Eso en realidad no es lo mismo. Al devolver NO, el reconocedor de gestos no maneja el toque. Al devolver SÍ, el UIView no maneja el toque. cancelaTouchSInView establecido en NO significa que tanto el reconocedor de gestos como la vista reciben el toque. – Till

+0

Estás en lo correcto. Si quisiera lograr ambos, podría manejar el evento táctil aquí * antes de * devolver NO. – john

2

Para mí una combinación de las respuestas anteriores dio

UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(userDidTap:)]; 
tapRecognizer.cancelsTouchesInView = YES; 
tapRecognizer.delegate = self; 
[tapRecognizer requireGestureRecognizersToFail:self.scrollView.gestureRecognizers]; 
[self.view addGestureRecognizer:tapRecognizer]; 

-

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 
{ 
    if ([touch.view.superview isKindOfClass:[UIButton class]] || [touch.view isKindOfClass:[UIButton class]]) 
    { 
     return NO; 
    } 
    return YES; 
} 
+0

Esto haría que el reconocedor de gestos fallara en el botón; no estoy seguro de cómo se correlaciona con la pregunta. – Till

+0

Sí, lo hará. En mi caso, eso es un comportamiento deseado. La pregunta no es clara en este punto a mi entender. – hfossli

Cuestiones relacionadas