2013-07-17 13 views
5

Dołączyłem UILongPressGestureRecognizer do widoku kolekcji, aby palcem przytrzymać użytkownika komórkę w tabeli i zapytać, czy chce ją usunąć.Identyfikacja komórki po pobraniu lokalizacji w UICollectionView

Mam problem polegający na tym, że nie mogę uzyskać właściwości indexPath tak jak w komórce tabeli (przy użyciu indexPathForRowAtPoint), czy istnieje odpowiednik?

Jeśli nie, to zastanawiałem się nad dodaniem gestu do każdej komórki, ale jak rozpoznać, który gest (nie widzę "tagu" dla gestu), np. czy mogę wysłać indexPath.item do selektora? Lub jakiejś innej metody?

Odpowiedz

15

Masz to samo na UICollectionView. Według documentation:

indexPathForItemAtPoint: Zwraca ścieżkę indeksu elementu w określonego punktu w widoku kolekcji.

  • (NSIndexPath *) indexPathForItemAtPoint: Punkt (CGPoint) Parametry point Punkt w układzie współrzędnych widoku kolekcji. Wartość zwracana Ścieżka indeksu elementu w określonym punkcie lub zero, jeśli w określonym punkcie nie znaleziono pozycji .

Dyskusja Metoda ta opiera się na informacjach dostarczonych przez układ skojarzony układ obiektu, aby określić, który element zawiera punkt .

Dostępność Dostępne w iOS 6.0 i nowszych wersjach. Zadeklarowane w UICollectionView.h

+0

próbowałem ForItem jak również i ona powiedziała mi, że nie było żadnej widocznej interfejs do niego i na bliżej inspekcja Znalazłem, próbowałem zrobić to na UIView z prawie taką samą nazwą jak UIColectionView. Jestem idiotą, bo tego nie zauważam i nie wymieniam lepiej ... Dzięki za to. –

+0

To było bardzo przydatne, dziękuję. – StackRunner

3

Należy pamiętać, że CGPoint że masz czasami przychodzi w układzie odniesienia UIViewController i działa tak długo, jak nie ma przewijania zaangażować. Podczas przewijania musisz przełożyć punkt na rzeczywisty punkt w przewijanym widoku, dodając przesunięcie przewijania.

W tym przykładzie CGPoint nadchodzi z 3DTouch w całym UIViewController, który zawiera UICollectionView wewnątrz

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

Dokładnie problem, który miałem (ale przy użyciu Xamarin.iOS) i to rozwiązało problem. Ale teraz, kiedy używam 3D Touch, początkowy kontur komórki źródłowej jest wyświetlany, gdy podgląd jest widoczny. Aby, miejmy nadzieję, wyjaśnić to bardziej, jeśli wymuszam dotknięcie elementu komórki, podgląd zaczyna się pojawiać, ale zaczyna się rozszerzać w miejscu, w którym pierwotna komórka znajduje się przed przesunięciem. – Tahari

+0

I tylko aktualizacja do mojego poprzedniego komentarza (który właśnie opracowałem po wysłaniu go), była taka, że ​​jeśli zarejestrujesz sam UICollectionView w RegisterForPreviewingWithDelegate, to przesunięcie nie jest już wymagane. Tak więc kod Xamarin.iOS to: ' RegisterForPreviewingWithDelegate (new PhotoPreviewingDelegate (this), this.CollectionView); ' – Tahari

+1

Przegłosowałem, ponieważ twoja odpowiedź doprowadziła mnie we właściwym kierunku, ale dla mnie zadziałało przekonwertowanie' CGPoint' z moich współrzędnych "widoku" na moje współrzędne 'collectionView'. 'let actualLocation = view.convert (location, to: collectionView)' –

Powiązane problemy