2011-09-28 22 views
10

¡Espero que alguien me pueda ayudar con un problema por el que me estoy metiendo de cabeza en este momento!Detección de gestos de deslizamiento en UITableViewCell dentro de UIScrollView

Dada la siguiente vista de jerarquía

enter image description here

Quiero ser capaz de detectar gestos banda magnética en mi costumbre UITableViewCell.

He subclase la UIScrollView y tienen un hitTest: withEvent: método que comprueba si estoy tocando la célula tableview (o su contenido) o no, en cuyo caso puse la siguiente vista de desplazamiento propiedades:

- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    UIView* result = [super hitTest:point withEvent:event]; 
    if ([result.superview isKindOfClass:[UITableViewCell class]] || [result.superview tag] == SUBVIEW_TAG) 
    { 
     self.canCancelContentTouches = NO; 
     self.delaysContentTouches = YES; 
    } else { 
     self.canCancelContentTouches = YES; 
     self.delaysContentTouches = NO; 
    } 
    return result; 
} 

también han puesto en marcha:

- (BOOL)touchesShouldCancelInContentView:(UIView *)view 
{ 
    if (view.tag == SUBVIEW_TAG || [[view superview] isKindOfClass:[UITableViewCell class]]) 
     return NO; 
    return YES; 
} 

y estoy volviendo NO en caso de que el punto de vista de haber sido afectado es la célula vista de tabla.

Todos estos métodos se llaman y realizan sus acciones como se esperaba, pero todavía no puedo detener el UIScrollView de "acaparar" el gesto de deslizar.

Lo interesante es que si incluyo el UIView que contiene la tabla vista y la celda en ambos métodos (el que tiene SUBVIEW_TAG) funciona perfectamente así que supongo que debe ser algo relacionado con el hecho de que UITableView hereda de UIScrollView.

Mi objetivo principal es poder deslizar sobre la celda para revelar más opciones para la celda. Un deslizamiento horizontal en cualquier otro lugar en esa vista sería capturado por la vista de desplazamiento y desplazar el contenido horizontalmente según su comportamiento normal.

¡Cualquier idea sería muy apreciada!

Gracias! Rog

+0

no es suficiente para añadir un reconocedor de trazos hasta la UITableViewCell? – teriiehina

+0

¿Alguna vez resolvió esto? Si es así, ¿te importaría compartir tu solución? Usted ha descrito el problema muy bien y con gran detalle: ¡una respuesta similar sería fantástica! – iOSProgrammingIsFun

+0

sí, una solución para eso sería increíble – Pasta

Respuesta

2

He tenido un problema similar con un golpe detectar para un componente dentro de un ScrollView y yo era capaz de resolverla con

[scrollView.panGestureRecognizer requireGestureRecognizerToFail:swipeGesture] 

Dónde ScrollView es el objeto de vista de desplazamiento que actúa como contenedor y swipeGesture es el objeto componente del gesto deslizar dentro de scrollview.

Por lo tanto, se puede definir un golpe para el objeto de celda como esto (por golpe justo en el ejemplo, la costumbre, tal como desee)

UISwipeGestureRecognizer* rightSwipeRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(yourMethod)]; 
     [rightSwipeRecognizer setDirection:UISwipeGestureRecognizerDirectionLeft]; 

[cell addGestureRecognizer:rightSwipeRecognizer]; 

y luego hacer

[scrollView.panGestureRecognizer requireGestureRecognizerToFail:rightSwipeRecognizer] 

La documentación de requireGestureRecognizerToFail dice:

Este método crea una relación con otro reconocedor de gestos que retrasa la transición del receptor fuera de UIGestureRecognizerStatePossible.El estado que el receptor transiciones a depende de lo que ocurre con otherGestureRecognizer:

Si transiciones otherGestureRecognizer a UIGestureRecognizerStateFailed, las transiciones del receptor a su estado normal al lado .

si otherGestureRecognizer transición a UIGestureRecognizerStateRecognized o UIGestureRecognizerStateBegan, las transiciones receptor a UIGestureRecognizerStateFailed.

Un ejemplo en el que se puede llamar a este método es cuando desea un gesto de un solo toque requiere que un gesto de doble toque falle.

Disponibilidad Disponible en iOS 3.2 y posterior.

Hope helps!

2

La solución es bastante simple. Todo lo que necesita hacer es agregar UIScrollView dentro de usted UITableViewCell. Evitará el efecto de "acaparamiento" durante el gesto de deslizamiento.

Embedded UIScrollView

Cuestiones relacionadas