2010-12-15 5 views
13

J'ai un UIView qui couvre tous les UITableView. UIView utilise des outils de reconnaissance des gestes pour contrôler ce que la table affiche. J'ai toujours besoin du défilement vertical UITableView et des taps de ligne. Comment les transmettre à la table depuis les reconnaisseurs de mouvements?Gesture Recognizers et TableView

+0

Je crois « [geste tablView] » devrait être « [yourTableView addGestureRecognizer: geste] » –

Répondre

30

cédez votre geste à la vue de la table et la table prendra soin:

UISwipeGestureRecognizer *gesture = [[UISwipeGestureRecognizer alloc] 
     initWithTarget:self action:@selector(handleSwipeFrom:)]; 
[gesture setDirection: 
     (UISwipeGestureRecognizerDirectionLeft 
     |UISwipeGestureRecognizerDirectionRight)]; 
[tableView addGestureRecognizer:gesture]; 
[gesture release]; 

Ensuite, dans votre méthode d'action de geste, agir en fonction de la direction:

- (void)handleSwipeFrom:(UISwipeGestureRecognizer *)recognizer { 
    if (recognizer.direction == UISwipeGestureRecognizerDirectionLeft) { 
     [self moveLeftColumnButtonPressed:nil]; 
    } 
    else if (recognizer.direction == UISwipeGestureRecognizerDirectionRight) { 
     [self moveRightColumnButtonPressed:nil]; 
    } 
} 

La table Ne passez que les gestes que vous avez demandés après les avoir manipulés en interne.

+0

Cette est la bonne réponse. Mais pouvez-vous s'il vous plaît me dire comment connaître la tableview indexPath dans la méthode handleSwipeFrom? – dinesh

+4

Cela ne fonctionnera pas - la propriété direction sur UISwipeGestureRecognizer indique quelles directions peuvent être reconnues (dans ce cas à gauche et à droite) et non dans quelle direction WAS a été glissé. Vous devrez séparer les identificateurs de mouvement –

+1

Oui, recognizer.direction aura toujours 3 et ne correspondra jamais. C'est sans doute un bug: http://stackoverflow.com/questions/3319209/setting-direction-for-uiswipegesturerecognizer – Symmetric

31

Si vous avez besoin de savoir indexPath de votre cellulaire:

- (void)handleSwipeFrom:(UIGestureRecognizer *)recognizer { 
    CGPoint swipeLocation = [recognizer locationInView:self.tableView]; 
    NSIndexPath *swipedIndexPath = [self.tableView indexPathForRowAtPoint:swipeLocation]; 
    UITableViewCell *swipedCell = [self.tableView cellForRowAtIndexPath:swipedIndexPath]; 
} 

Cela a été répondu précédemment à UIGestureRecognizer and UITableViewCell issue.

+0

Merci, je cherchais cette solution. Je n'avais aucune idée 'locationInView' merci beaucoup – carbonr

+0

Sauvé mon bacon, merci mon pote! – jcrowson

7

J'ai essayé la suggestion de Rob Bonner et ça marche très bien. Je vous remercie.

Mais, dans mon cas, il y a un problème de reconnaissance de direction. (recognizer.direction se réfèrent toujours à 3) J'utilise IOS5 SDK et Xcode 4.

Cela semble provoqué par "[gesture setDirection: (left | right)]" Je pense. Donc, si quelqu'un a un problème comme moi et que vous voulez reconnaître le balayage de gauche et de droite séparément, alors assignez deux reconnaissances à la vue de table avec des directions différentes.

Comme ceci:

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

UISwipeGestureRecognizer *swipeRightGesture = [[UISwipeGestureRecognizer alloc] 
               initWithTarget:self 
               action:@selector(handleSwipeRight:)]; 

[swipeRightGesture setDirection: UISwipeGestureRecognizerDirectionRight]; 

[tableView addGestureRecognizer:swipeLeftGesture]; 
[tableView addGestureRecognizer:swipeRightGesture]; 

et action geste ci-dessous:

- (void)handleSwipeLeft:(UISwipeGestureRecognizer *)recognizer { 
    [self moveLeftColumnButtonPressed:nil]; 
} 

- (void)handleSwipeRight:(UISwipeGestureRecognizer *)recognizer { 
    [self moveRightColumnButtonPressed:nil]; 
} 

I codé avec fonction ARC alors si vous ne l'utilisez ARC, ajouter des codes de libération.

PS: Mon anglais est pas si bon, donc s'il y a une erreur sentential, la correction sera très heureux :)