web-dev-qa-db-fra.com

Comment implémenter le balayage de gauche à droite dans la cellule UITableView similaire à iOS Mail

J'essaie de reproduire la même technique que Apple utilise dans leur application de messagerie pour marquer le courrier comme non lu ou "Marquer comme non lu" lorsque vous balayez de gauche à droite dans une boîte aux lettres.

Screenshot of Mail inside iOS 8.1 Mail app

J'ai trouvé similairesolutions mais uniquement pour un geste de balayage de droite à gauche. J'espérais que cette même solution était disponible dans le cadre du SDK Apple pour la direction opposée.

Comment puis-je obtenir le même effet de geste de gauche à droite que l'application de messagerie d'iOS?

24
gh0st

J'ai trouvé des solutions similaires mais uniquement pour un geste de glisser de de droite à gauche.

SWTableViewCell a toutes les options que vous pourriez souhaiter.

Lorsque vous déquez une cellule, configurez simplement un ensemble de boutons gauche/droite selon les besoins.

cell.leftUtilityButtons = [self leftButtons];
cell.rightUtilityButtons = [self rightButtons];
cell.delegate = self;

Et en définissant le contrôleur de vue comme son délégué, vous pouvez écouter les clics sur le bouton. Tous les détails sur la façon de mettre en œuvre sont dans ce lien

Ex 1:

enter image description here

Ex 2: enter image description here

Dans le cas où vous recherchez des boutons empilés verticalement, consultez this .

28
GoodSp33d

Je l'implémente généralement au niveau de la table.

- (void)viewDidLoad
{
    [super viewDidLoad];

    UISwipeGestureRecognizer *recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self
                                                                                  action:@selector(leftSwipe:)];
    [recognizer setDirection:(UISwipeGestureRecognizerDirectionLeft)];
    [self.tableView addGestureRecognizer:recognizer];

    recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self
                                                        action:@selector(rightSwipe:)];
    recognizer.delegate = self;
    [recognizer setDirection:(UISwipeGestureRecognizerDirectionRight)];
    [self.tableView addGestureRecognizer:recognizer];
}

Vous avez alors le contrôle de la direction et pouvez personnaliser à volonté

- (void)leftSwipe:(UISwipeGestureRecognizer *)gestureRecognizer
{
    //do you left swipe stuff here. 
}

- (void)rightSwipe:(UISwipeGestureRecognizer *)gestureRecognizer
{
    //do you right swipe stuff here. Something usually using theindexPath that you get that way
    CGPoint location = [gestureRecognizer locationInView:self.tableView];
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:location];
}

Le crédit revient à Jade Mind

20
GrandSteph

La réponse acceptée dans le lien que vous avez fourni concerne les deux directions de balayage.
Remarquerez que gestureRecognizer.direction renvoie YES à la fois pour UISwipeGestureRecognizerDirectionLeft et UISwipeGestureRecognizerDirectionRight.

Vous aurez juste besoin de modifier quelques éléments:
Modifiez le sélecteur qui est appelé lors du glissement, afin qu'il appelle votre méthode, au lieu de celle de l'exemple de l'article,
.

Votre code devrait donc ressembler à ceci:

// In cellForRowAtIndexPath:, where you create your custom cell  
cell.tableView=tableView;  
cell.indexPath=indexPath;
UISwipeGestureRecognizer *swipeGestureRecognizer=[[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(YOUR_METHOD_GOES_HERE)];
[cell addGestureRecognizer:swipeGestureRecognizer];  

.

-(BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {  
    if([[gestureRecognizer view] isKindOfClass:[UITableViewCell class]] && ((UISwipeGestureRecognizer*)gestureRecognizer.direction==UISwipeGestureRecognizerDirectionRight)  
        return YES;  
}

Notez que vous pouvez également utiliser la réponse sous la réponse acceptée et modifier simplement la propriété direction de reconnaissance de gestes pour être UISwipeGestureRecognizerDirectionRight, au lieu de la direction actuelle dans l'exemple, qui est UISwipeGestureRecognizerDirectionLeft.

Si vous choisissez de l'implémenter, votre viewController doit implémenter le délégué de reconnaissance de mouvement, et votre code devrait ressembler à ceci:

// Call this method in viewDidLoad  
- (void)setUpLeftSwipe {  
    UISwipeGestureRecognizer *recognizer;  
    recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self
                                                   action:@selector(swipeRightt:)];  
    [recognizer setDirection:UISwipeGestureRecognizerDirectionRight];  
    [self.tableView addGestureRecognizer:recognizer];  
    recognizer.delegate = self;  
}  


- (void)swipeRight:(UISwipeGestureRecognizer *)gestureRecognizer {  
    CGPoint location = [gestureRecognizer locationInView:self.tableView];  
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:location];  
    ... do something with cell now that i have the indexpath, maybe save the world? ...  
}  

Remarque - si je ne me trompe pas, vous devrez créer vous-même l'animation de balayage de cellule, car, je crois, l'animation de cellule par défaut de Xcode ne se produit que lorsque vous faites glisser vers la gauche.

Le crédit revient à MadhavanRP et Julian à partir du lien que vous avez fourni. Je viens de modifier leurs réponses pour mieux répondre à vos besoins.
Je n'ai pas essayé et implémenté cela moi-même cependant.

2
AMI289