2011-09-28 19 views
10

Spero che qualcuno sarà in grado di aiutarmi con un problema che sta facendo la mia testa al momento!Rilevamento dei gesti di scorrimento su UITableViewCell all'interno di UIScrollView

Data la gerarchia seguente vista

enter image description here

voglio essere in grado di rilevare gesti di scorrimento sulla mia abitudine UITableViewCell.

ho sottoclasse l'UIScrollView e hanno un hitTest: withEvent: metodo che controlla se sto toccando la cella Tableview (o il suo contenuto) o no, nel qual caso ho impostato le seguenti vista di scorrimento proprietà:

- (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; 
} 

ho anche implementato:

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

e sto tornando NO nel caso in cui la vista essere toccato è la cellula vista tabella.

Questi metodi vengono tutti richiamati ed eseguono le loro azioni come previsto, ma non riesco ancora a interrompere UIScrollView da "hogging" al gesto di scorrimento.

La cosa interessante è che se includo il UIView che contiene il tableview e la cella su entrambi i metodi sopra (quello con SUBVIEW_TAG) funziona perfettamente quindi sto indovinando che deve essere qualcosa a che fare con il fatto che UITableView eredita da UIScrollView.

Il mio obiettivo principale è quello di essere in grado di scorrere sulla cella per rivelare più opzioni per la cella. Un movimento orizzontale in qualsiasi altro punto di quella vista verrebbe catturato dalla vista di scorrimento e sposterebbe il contenuto orizzontalmente secondo il suo comportamento normale.

Qualsiasi idea sarebbe molto apprezzata!

Grazie! Rog

+0

non è sufficiente per aggiungere un sistema di riconoscimento gesto al UITableViewCell? – teriiehina

+0

Hai mai risolto questo? In tal caso, ti dispiacerebbe condividere la tua soluzione? Hai descritto il problema molto bene e con dettagli eccellenti - una risposta in un modo simile sarebbe fantastica! – iOSProgrammingIsFun

+0

sì, una soluzione per questo sarebbe fantastico – Pasta

risposta

2

Ho avuto un problema simile con un colpo rileva per un componente all'interno di uno ScrollView e ho potuto risolvere con

[scrollView.panGestureRecognizer requireGestureRecognizerToFail:swipeGesture] 

Dove ScrollView è l'oggetto vista di scorrimento che agisce come contenitore e swipeGesture è il componente striscia l'oggetto gesto all'interno di scrollview.

Quindi, è possibile definire un colpo per l'oggetto delle cellule come questo (per scorri verso destra nell'esempio, personalizzato come si vuole)

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

[cell addGestureRecognizer:rightSwipeRecognizer]; 

e poi fare

[scrollView.panGestureRecognizer requireGestureRecognizerToFail:rightSwipeRecognizer] 

La documentazione di requireGestureRecognizerToFail dice:

Questo metodo crea un rapporto con un altro gesto riconoscitore che ritarda la transizione del ricevitore da UIGestureRecognizerStatePossible.Lo stato che il ricevitore transizioni ad dipende da quanto accade con otherGestureRecognizer:

Se transizioni otherGestureRecognizer a UIGestureRecognizerStateFailed, le transizioni ricevitore al suo normale stato successivo.

se otherGestureRecognizer transizione allo UIGestureRecognizerStateRecognized o UIGestureRecognizerStateBegan, le transizioni ricevitore si UIGestureRecognizerStateFailed.

Un esempio in cui è possibile chiamare questo metodo è quando si desidera che un gesto con tocco singolo da richieda il fallimento di un gesto di doppio tocco.

Disponibilità Disponibile in iOS 3.2 e successive.

La speranza aiuta!

2

La soluzione è piuttosto semplice. Tutto quello che devi fare è aggiungere UIScrollView all'interno di tu UITableViewCell. Impedirà l'effetto "hogging" durante il gesto di scorrimento.

Embedded UIScrollView

Problemi correlati