Comment utiliser UILongPressGestureRecognizer avec un UICollectionViewCell dans Swift?

Je voudrais comprendre comment imprimer l'indexPath d'un UICollectionViewCell quand j'appuie longuement sur une cellule.

Comment puis-je faire ça dans Swift?

J'ai cherché partout un exemple de comment faire cela; ne peut pas find un dans Swift.

D'abord, votre controller de vue doit être UIGestureRecognizerDelegate . Puis ajoutez un UILongPressGestureRecognizer à votre collectionView dans la méthode viewDidLoad() votre viewcontroller

 class ViewController: UIViewController, UIGestureRecognizerDelegate { override func viewDidLoad() { super.viewDidLoad() let lpgr = UILongPressGestureRecognizer(target: self, action: "handleLongPress:") lpgr.minimumPressDuration = 0.5 lpgr.delaysTouchesBegan = true lpgr.delegate = self self.collectionView.addGestureRecognizer(lpgr) } 

La méthode pour gérer une pression longue:

 func handleLongPress(gestureReconizer: UILongPressGestureRecognizer) { if gestureReconizer.state != UIGestureRecognizerState.Ended { return } let p = gestureReconizer.locationInView(self.collectionView) let indexPath = self.collectionView.indexPathForItemAtPoint(p) if let index = indexPath { var cell = self.collectionView.cellForItemAtIndexPath(index) // do stuff with your cell, for example print the indexPath println(index.row) } else { println("Could not find index path") } } 

Ce code est basé sur la version Objective-C de cette réponse .

La réponse de ztan est convertie en syntaxe swift 3:

 func handleLongPress(_ gestureReconizer: UILongPressGestureRecognizer) { if gestureReconizer.state != UIGestureRecognizerState.ended { return } let p = gestureReconizer.location(in: collectionView) let indexPath = collectionView.indexPathForItem(at: p) if let index = indexPath { var cell = collectionView.cellForItem(at: index) // do stuff with your cell, for example print the indexPath print(index.row) } else { print("Could not find index path") } } 

Une chose que j'ai trouvée était celle-ci:

 if gestureReconizer.state != UIGestureRecognizerState.Ended { return } 

ne place pas de pin tant que vous n'avez pas relâché le longpress, ce qui est OK, mais j'ai trouvé

 if gestureRecognizer.state == UIGestureRecognizerState.Began { } 

autour de toute la fonction empêchera plusieurs placements de broches tout en laissant apparaître la broche dès que le timeout de la timer est satisfait.

Aussi, une faute de frappe ci-dessus: Reconizer -> Recognizer

La méthode handleLongProgress convertie en syntaxe swift 3 fonctionne correctement. Je veux juste append que l'initialisation de lpgr devrait être changée en:

 let lpgr = UILongPressGestureRecognizer(target: self, action: #selector(handleLongPress(gestureReconizer:)))