2010-07-20 22 views
7

Estoy usando una subclase personalizada UIGestureRecognizer para rastrear gestos en mi clase InfoView. La clase InfoView es una subvista de una subclase personalizada UITableViewCell llamada InfoCell.UIGestureRecognizer que bloquea la vista de tabla que se desplaza

He agregado mi reconocedor de gestos a mi vista raíz (la vista principal de todo lo demás en la pantalla, porque el propósito de mi reconocedor de gestos personalizado es permitir el arrastre de InfoCell vistas entre tablas). Ahora, todo funciona como debería, excepto una cosa. Estoy usando el siguiente código en mi UIGestureRecognizer subclase para detectar toques en la InfoView vista:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    UIView *touchView = [[touches anyObject] view]; 
    if ([touchView isKindOfClass:[InfoView class]]) { 
     // Do stuff 
    } 

El problema aquí es que los toques en el objeto InfoView están siendo interceptadas, por lo tanto, no se está remitiendo a la UITableView que contiene el InfoCell, que es la vista principal del InfoView. Esto significa que ya no puedo desplazar la vista de tabla arrastrando en la vista InfoView, que es un problema porque el InfoView cubre todo el InfoCell.

¿Hay alguna manera de reenviar los toques a la vista de tabla para que pueda desplazarse? He intentado un montón de cosas ya:

[super touchesBegan:touches withEvent:event];

[touchView.superview.superview touchesBegan:touches withEvent:event]; (touchView.superview.superview obtiene una referencia a su matriz UITableView)

pero nada ha funcionado hasta ahora. Además, la propiedad cancelsTouchesInView de mi UIGestureRecognizer está configurada en NO, por lo que no interfiere con los toques.

Se agradece la ayuda. ¡Gracias!

Respuesta

3

Tenía una línea en mi método touchesBegan que establecía la propiedad state del reconocedor de gestos en UIGestureRecognizerStateBegan. Eliminar esta línea parece solucionar el problema.

9

UIGestureRecognizer tiene una propiedad "cancelsTouchesInView" que está establecida en SÍ de manera predeterminada. Esto significa que los toques en una UIView se cancelan cuando se reconoce un gesto. Intente configurarlo en NO para permitir que UIScrollView reciba más eventos táctiles.

24

Comprobar a cabo el método UIGestureRecognizerDelegate: - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer

Si esto devuelve sí, va a evitar que el reconocedor gesto pisando fuerte en el que UIScrollView está utilizando para detectar el desplazamiento.

+0

Este cosas fijas para mí cuando tuve el mismo problema, gracias –

+0

he estado golpeando mi cabeza contra la pared en este caso. Gracias ! : D – Legolas

3

Usted puede tratar de añadir esta notificación

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer { 
    if ([gestureRecognizer class] == [UIPanGestureRecognizer class]) { 
     UIPanGestureRecognizer *panGestureRec = (UIPanGestureRecognizer *)gestureRecognizer; 
     CGPoint point = [panGestureRec velocityInView:self]; 
     if (fabsf(point.x) > fabsf(point.y)) { 
      return YES; 
     } 
    } 
    return NO; 
} 
+0

esta es la respuesta correcta, evite que panGesture comience si el gesto es vertical. – Vassily

Cuestiones relacionadas