Objectif c
Dans votre myCollectionViewController.h
dossier, ajoutez le UIGestureRecognizerDelegate
protocole
@interface myCollectionViewController : UICollectionViewController<UIGestureRecognizerDelegate>
dans votre myCollectionViewController.m
dossier:
- (void)viewDidLoad
{
// attach long press gesture to collectionView
UILongPressGestureRecognizer *lpgr
= [[UILongPressGestureRecognizer alloc]
initWithTarget:self action:@selector(handleLongPress:)];
lpgr.delegate = self;
lpgr.delaysTouchesBegan = YES;
[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
}
}
Rapide
class Some {
@objc func handleLongPress(gesture : UILongPressGestureRecognizer!) {
if gesture.state != .Ended {
return
}
let p = gesture.locationInView(self.collectionView)
if let indexPath = self.collectionView.indexPathForItemAtPoint(p) {
// get the cell at indexPath (the one you long pressed)
let cell = self.collectionView.cellForItemAtIndexPath(indexPath)
// do stuff with the cell
} else {
print("couldn't find index path")
}
}
}
let some = Some()
let lpgr = UILongPressGestureRecognizer(target: some, action: #selector(Some.handleLongPress))
Swift 4
class Some {
@objc func handleLongPress(gesture : UILongPressGestureRecognizer!) {
if gesture.state != .ended {
return
}
let p = gesture.location(in: self.collectionView)
if let indexPath = self.collectionView.indexPathForItem(at: p) {
// get the cell at indexPath (the one you long pressed)
let cell = self.collectionView.cellForItem(at: indexPath)
// do stuff with the cell
} else {
print("couldn't find index path")
}
}
}
let some = Some()
let lpgr = UILongPressGestureRecognizer(target: some, action: #selector(Some.handleLongPress))
UICollectionViewCell* cell = [self.collectionView cellForItemAtIndexPath:indexPath];
référence ici j'espère que tout cela mérite une réponse correcte Award: Dlpgr.delaysTouchesBegan = YES;
pour éviter d'didHighlightItemAtIndexPath
être déclenché en premier.lpgr.delegate = self;
? Cela fonctionne bien sans délégué, ce que vous n'avez pas non plus fourni.UIGestureRecognizerStateBegan
, donc le geste est utilisé lorsqu'il est reconnu, pas lorsque l'utilisateur relâche son doigt.Le même code @ abbood's code pour Swift:
Dans viewDidLoad:
Et la fonction:
N'oubliez pas le délégué
UIGestureRecognizerDelegate
la source
UIGestureRecognizerState.Ended
pourUIGestureRecognizerState.Began
si vous voulez que le code se déclenche une fois la durée minimale écoulée, pas seulement lorsque l'utilisateur prend son doigt.Utilisez le délégué de UICollectionView pour recevoir un événement de presse longue
Vous devez impliquer 3 méthodes ci-dessous.
la source
Les réponses ici pour ajouter un outil de reconnaissance de gestes longue pression personnalisé sont correctes, cependant, selon la documentation ici : la classe parente de la
UICollectionView
classe installe undefault long-press gesture recognizer
pour gérer les interactions de défilement, vous devez donc lier votre outil de reconnaissance de gestes personnalisé au module de reconnaissance par défaut associé à votre vue de collection.Le code suivant évitera à votre outil de reconnaissance de gestes personnalisé d'interférer avec celui par défaut:
la source
The parent class of UICollectionView class installs a default tap gesture recognizer and a default long-press gesture recognizer to handle scrolling interactions. You should never try to reconfigure these default gesture recognizers or replace them with your own versions.
donc le module de reconnaissance par défaut est fait pour le défilement .. ce qui implique qu'il doit être accompagné d'un mouvement vertical .. l'OP ne demande pas à propos de ce genre de comportement et ilet ajoutez la méthode comme celle-ci.
la source
Pour disposer d'un outil de reconnaissance de mouvement externe et ne pas entrer en conflit avec les outils de reconnaissance de mouvement internes sur UICollectionView, vous devez:
Ajoutez votre reconnaissance de gestes, configurez-le et capturez une référence quelque part (la meilleure option est sur votre sous-classe si vous avez sous-classé UICollectionView)
Remplacer les méthodes d'initialisation par défaut
initWithFrame:collectionViewLayout:
etinitWithCoder:
et d' ajouter mis en place la méthode pour vous appuyez longuement sur le geste de reconnaissanceÉcrivez votre méthode de configuration de manière à ce qu'elle instancie le module de reconnaissance de geste de pression longue, définissez son délégué, configurez les dépendances avec le module de reconnaissance de geste UICollectionView (donc ce sera le geste principal et tous les autres gestes attendront que ce geste échoue avant d'être reconnu) et ajoutez un geste à la vue
N'oubliez pas non plus d'implémenter les méthodes UIGestureRecognizerDelegate qui échouent à ce geste et autorisent la reconnaissance simultanée (vous pouvez ou non avoir besoin de l'implémenter, cela dépend des autres outils de reconnaissance de gestes que vous avez ou des dépendances avec les outils de reconnaissance de gestes internes)
les informations d'identification pour cela vont à l'implémentation interne de LXReorderableCollectionViewFlowLayout
la source
Swift 5:
N'oubliez pas non plus d'implémenter UIGestureRecognizerDelegate et d'appeler setupLongGestureRecognizerOnCollection depuis viewDidLoad ou partout où vous devez l'appeler.
la source
Peut-être que l'utilisation de UILongPressGestureRecognizer est la solution la plus répandue. Mais j'y rencontre deux ennuis ennuyeux:
Laissez-moi en suggérer un un peu bruteforce, mais en travaillant comme il est nécessaire suggestion:
Déclarer une description de rappel pour un clic long sur notre cellule:
typealias OnLongClickListener = (view: OurCellView) -> Void
Extension de UICollectionViewCell avec des variables (nous pouvons le nommer OurCellView, par exemple):
Ajout de deux méthodes dans notre classe de cellules:
Et écraser les événements tactiles ici:
Puis quelque part dans le contrôleur de notre vue de collection déclarant l'écouteur de rappel:
Et enfin dans le callback de paramétrage cellForItemAtIndexPath pour nos cellules:
Nous pouvons désormais intercepter les actions de clic long sur nos cellules.
la source