2011-11-29 13 views

risposta

14

Il modo corretto per farlo è aggiungere l'UITapGestureRecognizer sul tableView:

UITapGestureRecognizer* doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTap:)]; 
doubleTap.numberOfTapsRequired = 2; 
doubleTap.numberOfTouchesRequired = 1; 
[self.tableView addGestureRecognizer:doubleTap]; 

UITapGestureRecognizer* singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTap:)]; 
singleTap.numberOfTapsRequired = 1; 
singleTap.numberOfTouchesRequired = 1; 
[singleTap requireGestureRecognizerToFail:doubleTap]; 
[self.tableView addGestureRecognizer:singleTap]; 

Poi nei tuoi metodi di callback a trovare la cella con qualcosa di simile:

-(void)singleTap:(UITapGestureRecognizer*)tap 
{ 
    if (UIGestureRecognizerStateEnded == tap.state) 
    { 
     CGPoint p = [tap locationInView:tap.view]; 
     NSIndexPath* indexPath = [_tableView indexPathForRowAtPoint:p]; 
     UITableViewCell* cell = [_tableView cellForRowAtIndexPath:indexPath]; 
     // Do your stuff 
    } 
} 
+2

Ciao, ho provato questo metodo, ma ogni volta che faccio doppio Tapp su una cella, è sempre andare in metodo del singolo rubinetto. Non passa mai alla funzione di doppio tocco. Ho scritto esattamente lo stesso codice che hai fornito. per favore aiuto. –

+0

Per far funzionare tutto questo è necessario disabilitare l'interazione dell'utente sulla cella. Questo impedirà alla cellula di mangiare il singolo tap prima che i riconoscitori dei gesti del tavolo abbiano la possibilità di fare il loro lavoro. – rickerbh

+4

Se si disattiva l'interazione dell'utente, come si scorre? –

6

ho raggiunto questo aggiungendo quanto segue al tuo riconoscitore di gesti, anche se trovo che c'è un leggero ritardo durante il tocco singolo.

[tapRecognizer setDelaysTouchesBegan:YES]; 
[tapRecognizer setCancelsTouchesInView:YES]; 
0

hai dimenticato [rilascio doubleTap];

UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTap:)]; 

doubleTap.numberOfTapsRequired = 2; 

doubleTap.numberOfTouchesRequired = 1; 

[cell addGestureRecognizer:doubleTap]; 

[doubleTap release]; 
0

È necessario disporre di questa linea per separare tra singolo e doppio tocco. [singleTap requireGestureRecognizerToFail: doubleTap]; Ecco il codice di esempio.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // After cell initialized code 
    //... 
    //... 

    UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTap:)]; 
    doubleTap.numberOfTapsRequired = 2; 

    UITapGestureRecognizer* singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doSingleTap:)]; 
    singleTap.numberOfTapsRequired = 1; 
    [singleTap requireGestureRecognizerToFail:doDoubleTap]; 

    [cell addGestureRecognizer:singleTap]; 
    [cell addGestureRecognizer:doubleTap]; 
    return cell; 
} 

-(void)doubleTap:(UITapGestureRecognizer*)tap 
{ 
    NSLog(@"Double Taps"); 

    CGPoint point = [tap locationInView:self.tableView]; 
    NSIndexPath* indexPath = [self.tableView indexPathForRowAtPoint: point]; 
    UITableViewCell* cell = [self.tableView cellForRowAtIndexPath:indexPath]; 
    // do your stuff. 
    // ... 
} 

-(void)singleTap:(UITapGestureRecognizer*)tap 
{ 
    NSLog(@"Single Tap"); 
    CGPoint point = [tap locationInView:self.tableView]; 
    NSIndexPath* indexPath = [self.tableView indexPathForRowAtPoint:point]; 
    UITableViewCell* cell = [self.tableView cellForRowAtIndexPath:indexPath]; 

    // Do you stuff with index path or cell here. 
    // ... 

} 
+0

Questo è sbagliato! L'aggiunta di 2 riconoscitori alla vista tabella in viewDidLoad è sufficiente. stai creando 2 riconoscitori tableview.count! Se hai molte celle, prendi la memoria e la reattività dell'interfaccia utente per niente ... – altagir

Problemi correlati