2013-07-17 8 views
5

Ho allegato un UILongPressGestureRecognizer a una vista di raccolta con lo scopo del dito di attesa dell'utente su una cella nella tabella e viene chiesto se desiderano rimuoverlo.Identifica la cella dopo tocca la posizione in UICollectionView

Il problema che ho è che non riesco ad ottenere indexPath come farei con una cella di tabella (usando indexPathForRowAtPoint), c'è un equivalente?

Se non ho pensato di aggiungere il gesto a ciascuna cella, ma come identificare il gesto (non riesco a vedere un "tag" per un gesto), ad es. posso inviare indexPath.item nel selettore? O qualche altro metodo?

risposta

15

Hai la stessa cosa sullo UICollectionView. Secondo il documentation:

indexPathForItemAtPoint: Restituisce il percorso indice dell'elemento al punto specificato nella vista raccolta.

  • (NSIndexPath *) indexPathForItemAtPoint: punto (CGPoint) Parametri punto Un punto nel sistema di coordinate della vista di raccolta. Valore restituito Il percorso dell'indice dell'oggetto nel punto specificato o zero se non è stato trovato alcun elemento nel punto specificato.

Discussione Questo metodo si basa sulle informazioni fornite dal layout di l'oggetto del formato associato per determinare quale elemento contenente il punto .

Disponibilità Disponibile in iOS 6.0 e versioni successive. Dichiarato In UICollectionView.h

+0

ho cercato ForItem come bene e mi diceva che non vi era alcuna interfaccia visibile per esso e su una più stretta ispezione ho scoperto che stavo cercando di farlo su un UIView con lo stesso nome di UIColectionView. Sono un idiota per non accorgermene e per non nominare meglio ... Grazie per l'attenzione su questo. –

+0

Questo è stato estremamente utile grazie. – StackRunner

3

Si prega di notare che il CGPoint che si ottiene a volte è in arrivo nel sistema di riferimento UIViewController e lavora fintanto che non v'è alcun scorrimento coinvolta. Quando è necessario lo scorrimento, è necessario convertire il punto nel punto reale della vista scorrevole aggiungendo l'offset della pergamena.

In questo esempio il CGPoint proviene da un 3DTouch in tutto UIViewController che contiene un UICollectionView all'interno

public func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController?{ 
    let offsetPoint = self.musicCollectionVw.contentOffset 
    let realLocation = CGPoint(x: location.x + offsetPoint.x, y: location.y + offsetPoint.y) 
    if let indexPath = self.musicCollectionVw.indexPathForItem(at: realLocation){ 
     NSLog("Section: \(indexPath.section) Row: \(indexPath.row)") 
    } 
    return nil 
} 
+0

Esattamente il problema che stavo avendo (ma usando Xamarin.iOS) e questo ha risolto il problema. Ma ora, quando utilizzo il 3D Touch, viene visualizzato il contorno iniziale della cella di origine mentre viene visualizzata l'anteprima. Quindi, se si spera di chiarire ulteriormente questo aspetto, se forzo tocco l'elemento della cella, l'anteprima inizia a venire in vista ma inizia ad espandersi dove la cella originale è precedente all'offset. – Tahari

+0

E solo un aggiornamento al mio commento precedente (che ho appena elaborato dopo averlo postato) è stato se si registra UICollectionView stesso in RegisterForPreviewingWithDelegate, quindi l'offset non è più richiesto .. quindi il codice Xamarin.iOS è: ' RegisterForPreviewingWithDelegate (new PhotoPreviewingDelegate (this), this.CollectionView); ' – Tahari

+1

Ho upvoted perché la tua risposta mi ha portato nella giusta direzione, ma ciò che ha funzionato per me è stato convertire il' CGPoint' dalle mie coordinate 'view' alle mie coordinate' collectionView'. 'let actualLocation = view.convert (location, to: collectionView)' –