web-dev-qa-db-fra.com

Comment utiliser UILongPressGestureRecognizer avec un UICollectionViewCell dans Swift?

Je voudrais savoir comment imprimer le chemin indexPath d'un UICollectionViewCell lorsque j'appuie longuement sur une cellule.

Comment puis-je faire cela dans Swift?

J'ai cherché partout un exemple de la façon de procéder. impossible d'en trouver un à Swift.

21
webmagnets

D'abord, votre contrôleur de vue doit être UIGestureRecognizerDelegate. Ajoutez ensuite un UILongPressGestureRecognizer à votre collectionView dans la méthode viewDidLoad() de votre contrôleur de vue.

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 un appui long: 

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 .

61
ztan

ztan answer a été converti en syntaxe Swift 3 et en une mise à jour mineure:

func handleLongPress(_ gestureRecognizer: UILongPressGestureRecognizer) {
    if gestureRecognizer.state != UIGestureRecognizerState.ended {
      return
    }

    let p = gestureRecognizer.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")
    }
}
10
chr0x

La méthode handleLongProgress convertie à la syntaxe Swift 3 fonctionne bien. Je veux juste ajouter que l'initialisation de lpgr devrait être changée en:

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

Une chose que j'ai trouvée était que: 

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

ne place pas la broche avant de relâcher la pression longue, ce qui est correct, mais j’ai trouvé

if gestureRecognizer.state == UIGestureRecognizerState.Began { }  

tout autour de la fonction empêchera le placement de plusieurs broches tout en laissant la broche apparaître dès que le délai de la minuterie est satisfait. 

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

3
DPen

ztan answer a été converti en syntaxe Swift 4 et en mise à jour mineure:

@objc func handleLongPress(_ gestureRecognizer: UILongPressGestureRecognizer) {
    guard gestureRecognizer.state != .ended else { return }

    let point = gestureRecognizer.location(in: collectionView)

    if let indexPath = collectionView.indexPathForItem(at: point), 
       let cell = collectionView.cellForItem(at: indexPath) {
        // do stuff with your cell, for example print the indexPath
        print(indexPath.row)
    } else {
        print("Could not find index path")
    }
}
0
Artem