ios swift uigesturerecognizer uicollectionviewcell

ios - ¿Cómo uso UILongPressGestureRecognizer con un UICollectionViewCell en Swift?



uigesturerecognizer (5)

Me gustaría descubrir cómo imprimir en la indexPath de un UICollectionViewCell cuando presiono por un tiempo en una celda.

¿Cómo puedo hacer eso en Swift?

He mirado por todas partes para un ejemplo de cómo hacer esto; No puedo encontrar uno en Swift.


El método handleLongProgress convertido a swift 3 sintaxis funciona bien. Solo quiero agregar que la inicialización de lpgr debería cambiarse a:

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


La respuesta de ztan se convirtió a la sintaxis Swift 4 y la actualización de ortografía menor:

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


La respuesta de ztan se convirtió a la sintaxis swift 3 y la actualización de ortografía menor:

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


Una cosa que encontré fue que:

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

no coloca el pin hasta que sueltes la pulsación larga, lo cual está bien, pero encontré

if gestureRecognizer.state == UIGestureRecognizerState.Began { }

alrededor de toda la función evitará la colocación de varios pines, mientras que el pin aparecerá tan pronto como se cumpla el retraso del temporizador.

Además, un error tipográfico arriba: Reconizer -> Recognizer


Primero, su controlador de vista debe ser UIGestureRecognizerDelegate . Luego, agregue un UILongPressGestureRecognizer a su colecciónVer en el método viewDidLoad() su controlador de viewDidLoad()

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

El método para manejar la prensa larga:

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

Este código se basa en la versión de Objective-C de esta respuesta .