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