112 votes

Appui long sur UICollectionViewCell

Je me demandais comment faire pour ajouter une pression longue sur le geste de reconnaissance à un (sous-classe) UICollectionView. J'ai lu dans la documentation qu'il est ajouté par défaut, mais je ne peux pas comprendre comment.

Ce que je veux faire c'est: Appuyez longuement sur une cellule ( j'ai un calendrier truc de github ), obtenez lequel la cellule est exploité et puis faire des trucs avec elle. J'ai besoin de savoir ce que la cellule est longpressed. Désolé pour cette vaste question, mais je ne pouvais pas trouver quelque chose de mieux sur google ou ALORS

224voto

abbood Points 5959

C'est ce que tu fais:

dans votre fichier myCollectionViewController.h, ajoutez le protocole UIGestureRecognizerDelegate

 @interface myCollectionViewController : UICollectionViewController<UIGestureRecognizerDelegate>
 

dans votre fichier myCollectionViewController.m:

 - (void)viewDidLoad
{
    // attach long press gesture to collectionView
    UILongPressGestureRecognizer *lpgr 
       = [[UILongPressGestureRecognizer alloc]
                     initWithTarget:self action:@selector(handleLongPress:)];
    lpgr.minimumPressDuration = .5; //seconds
    lpgr.delegate = self;
    [self.collectionView addGestureRecognizer:lpgr];
}

-(void)handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer
{
    if (gestureRecognizer.state != UIGestureRecognizerStateEnded) {
        return;
    }
    CGPoint p = [gestureRecognizer locationInView:self.collectionView];

    NSIndexPath *indexPath = [self.collectionView indexPathForItemAtPoint:p];
    if (indexPath == nil){
        NSLog(@"couldn't find index path");            
    } else {
        // get the cell at indexPath (the one you long pressed)
        UICollectionViewCell* cell =
        [self.collectionView cellForItemAtIndexPath:indexPath];
        // do stuff with the cell
    }
}
 

Selon le commentaire dynamicDan , pour iOS7, cette ligne doit être ajoutée

 lpgr.delaysTouchesBegan = YES;
 

pour éviter que didHighlightItemAtIndexPath ne soit déclenché en premier.

8voto

tiguero Points 5664

Réponses ici pour ajouter un personnalisé, appuyez de manière prolongée sur un geste de reconnaissance sont corrects cependant , selon la documentation ici: la classe parent d' UICollectionView classe installe un default long-press gesture recognizer pour gérer le défilement des interactions de sorte que vous devez vous lien personnalisé appuyez sur le geste de reconnaissance de la valeur par défaut de reconnaissance associés à la collecte de votre point de vue.

Le code suivant va éviter personnalisé de votre geste de reconnaissance à interférer avec celui par défaut:

UILongPressGestureRecognizer* longPressGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPressGesture:)];

longPressGesture.minimumPressDuration = .5; //seconds
longPressGesture.delegate = self;

// Make the default gesture recognizer wait until the custom one fails.
for (UIGestureRecognizer* aRecognizer in [self.collectionView gestureRecognizers]) {
   if ([aRecognizer isKindOfClass:[UILongPressGestureRecognizer class]])
      [aRecognizer requireGestureRecognizerToFail:longPressGesture];
} 

2voto

satheeshwaran Points 3484
  UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress:)];

   [cell addGestureRecognizer:longPress];
 

et ajoutez la méthode comme ceci.

 - (void)longPress:(UILongPressGestureRecognizer*)gesture
{
    if ( gesture.state == UIGestureRecognizerStateEnded ) {

        UICollectionViewCell *cellLongPressed = (UICollectionViewCell *) gesture.view;
    }
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X