How do I use UILongPressGestureRecognizer with a UICollectionViewCell in Swift? How do I use UILongPressGestureRecognizer with a UICollectionViewCell in Swift? swift swift

How do I use UILongPressGestureRecognizer with a UICollectionViewCell in Swift?


First you your view controller need to be UIGestureRecognizerDelegate. Then add a UILongPressGestureRecognizer to your collectionView in your viewcontroller's viewDidLoad() method

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)    }

The method to handle long press:

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")        }    }

This code is based on the Objective-C version of this answer.


ztan answer's converted to swift 3 syntax and minor spelling update:

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")    }}


One thing I found was that:

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

doesn't place pin until you release the longpress, which is OK, but I found

if gestureRecognizer.state == UIGestureRecognizerState.Began { }  

around the whole function will prevent multiple pin placements while letting the pin appear as soon as the timer delay is satisfied.

Also, one typo above: Reconizer -> Recognizer