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