2015-03-24 8 views
18

Mi piacerebbe capire come stampare il indexPath di un UICollectionViewCell quando preme a lungo su una cella.Come utilizzare UILongPressGestureRecognizer con UICollectionViewCell in Swift?

Come posso farlo in Swift?

Ho cercato dappertutto un esempio di come farlo; non riesci a trovarne uno in Swift.

+0

Mostraci cosa hai provato. – rdelmar

+0

Ho provato così tante cose che sarebbe impossibile mettere tutto questo qui dentro. Ho provato a utilizzare le informazioni a questi link: http://stackoverflow.com/questions/23392485/change-background-of-uicollectionview-cell-on-tap - http://www.tagwith.com/question_73045_delete-uicollectionviewcell- with-uilongpressgesturerecognizer? ref = driverlayer.com/web - http://www.freshconsulting.com/create-drag-and-drop-uitableview-swift/ TONS di altre pagine. – webmagnets

risposta

56

Per prima cosa il controller di visualizzazione deve essere UIGestureRecognizerDelegate. Quindi aggiungere un UILongPressGestureRecognizer al vostro CollectionView in viewDidLoad() il metodo del viewcontroller

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

Il metodo per gestire pressione lunga:

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

Questo codice è basato sulla versione Objective-C di this answer.

+0

Grazie. Perfezionare! – webmagnets

+0

lavorato. su votato. – kennydust

+0

Il mio scorrimento verticale non funziona per la mia raccoltaVisualizza ora: (\ –

3

Una cosa che ho trovato era che:

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

non collocare il perno fino al rilascio del longpress, che è OK, ma ho trovato

if gestureRecognizer.state == UIGestureRecognizerState.Began { } 

intorno l'intera funzione impedirà multipla posiziona i pin mentre fa apparire il pin non appena il ritardo del timer è soddisfatto.

Inoltre, un errore di battitura sopra: Reconizer -> Recognizer

+0

Hai perfettamente ragione, sembra più simile alla mappa nativa avere il pin posizionato mentre stai ancora premendo piuttosto che aspettare che la stampa venga rilasciata per posizionare il pin C'è il codice completo di Swift qui: http://stackoverflow.com/a/29466391/1359088 –

8

del convertito in rapida 3 sintassi risposta ztan:

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

    let p = gestureReconizer.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") 
    } 
} 
3

Il metodo handleLongProgress convertito in rapida 3 sintassi funziona bene. Voglio solo aggiungere che l'inizializzazione di lpgr deve essere modificata in:

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