Cel C
W swoim myCollectionViewController.h
pliku dodaj UIGestureRecognizerDelegate
protokół
@interface myCollectionViewController : UICollectionViewController<UIGestureRecognizerDelegate>
w twoim myCollectionViewController.m
pliku:
- (void)viewDidLoad
{
// attach long press gesture to collectionView
UILongPressGestureRecognizer *lpgr
= [[UILongPressGestureRecognizer alloc]
initWithTarget:self action:@selector(handleLongPress:)];
lpgr.delegate = self;
lpgr.delaysTouchesBegan = YES;
[self.collectionView addGestureRecognizer:lpgr];
}
-(void)handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer
{
if (gestureRecognizer.state != UIGestureRecognizerStateEnded) {
return;
}
CGPoint p = [gestureRecognizer locationInView:self.collectionView];
NSIndexPath *indexPath = [self.collectionView indexPathForItemAtPoint:p];
if (indexPath == nil){
NSLog(@"couldn't find index path");
} else {
// get the cell at indexPath (the one you long pressed)
UICollectionViewCell* cell =
[self.collectionView cellForItemAtIndexPath:indexPath];
// do stuff with the cell
}
}
Szybki
class Some {
@objc func handleLongPress(gesture : UILongPressGestureRecognizer!) {
if gesture.state != .Ended {
return
}
let p = gesture.locationInView(self.collectionView)
if let indexPath = self.collectionView.indexPathForItemAtPoint(p) {
// get the cell at indexPath (the one you long pressed)
let cell = self.collectionView.cellForItemAtIndexPath(indexPath)
// do stuff with the cell
} else {
print("couldn't find index path")
}
}
}
let some = Some()
let lpgr = UILongPressGestureRecognizer(target: some, action: #selector(Some.handleLongPress))
Szybki 4
class Some {
@objc func handleLongPress(gesture : UILongPressGestureRecognizer!) {
if gesture.state != .ended {
return
}
let p = gesture.location(in: self.collectionView)
if let indexPath = self.collectionView.indexPathForItem(at: p) {
// get the cell at indexPath (the one you long pressed)
let cell = self.collectionView.cellForItem(at: indexPath)
// do stuff with the cell
} else {
print("couldn't find index path")
}
}
}
let some = Some()
let lpgr = UILongPressGestureRecognizer(target: some, action: #selector(Some.handleLongPress))
UICollectionViewCell* cell = [self.collectionView cellForItemAtIndexPath:indexPath];
odniesienie tutaj mam nadzieję , że wszystko to zasługuje na poprawną odpowiedź nagroda: Dlpgr.delaysTouchesBegan = YES;
aby uniknąć wyzwolenia wdidHighlightItemAtIndexPath
pierwszej kolejności.lpgr.delegate = self;
? Działa dobrze bez delegata, którego również nie podałeś.UIGestureRecognizerStateBegan
, więc gest jest używany, gdy zostanie rozpoznany, a nie gdy użytkownik zwolni palec.Ten sam kod @ abbood dla Swift:
W widokuDidLoad:
I funkcja:
Nie zapomnij o delegacie
UIGestureRecognizerDelegate
źródło
UIGestureRecognizerState.Ended
na,UIGestureRecognizerState.Began
jeśli chcesz, aby kod był uruchamiany po upływie minimalnego czasu trwania, a nie tylko wtedy, gdy użytkownik podniesie palec.Użyj delegata UICollectionView otrzymania zdarzenia długiego naciśnięcia
Musisz zastosować metodę impl 3 poniżej.
źródło
Odpowiedzi tutaj dotyczące dodania niestandardowego aparatu rozpoznawania gestów długiego naciśnięcia są poprawne, jednak zgodnie z dokumentacją tutaj : klasa nadrzędna klasy
UICollectionView
instaluje a,default long-press gesture recognizer
aby obsługiwać interakcje przewijania, więc musisz połączyć swój niestandardowy aparat rozpoznawania gestów dotknięcia z domyślnym urządzeniem rozpoznającym skojarzonym z widokiem kolekcji.Poniższy kod pozwoli uniknąć kolizji Twojego niestandardowego aparatu rozpoznawania gestów z domyślnym:
źródło
The parent class of UICollectionView class installs a default tap gesture recognizer and a default long-press gesture recognizer to handle scrolling interactions. You should never try to reconfigure these default gesture recognizers or replace them with your own versions.
więc domyślny aparat rozpoznający z długim naciśnięciem jest przeznaczony do przewijania ... co oznacza, że musi mu towarzyszyć ruch w pionie .. OP nie pyta o tego rodzaju zachowaniu, ani nie próbuje go zastąpići dodaj taką metodę.
źródło
Aby mieć zewnętrzny aparat rozpoznawania gestów i nie powodować konfliktu z wewnętrznymi aparatami rozpoznawania gestów w UICollectionView, musisz:
Dodaj swój aparat do rozpoznawania gestów, skonfiguruj go i przechwyć gdzieś odniesienie do niego (najlepsza opcja znajduje się w Twojej podklasie, jeśli podklasa UICollectionView)
Domyślnym nadpisanie metody inicjalizacji
initWithFrame:collectionViewLayout:
iinitWithCoder:
i dodaj skonfigurować metodę Ci długo prasowej gest rozpoznawaniaNapisz swoją metodę konfiguracji, aby tworzyła instancję rozpoznawania gestów długiego naciśnięcia, ustaw jej delegata, konfiguruj zależności za pomocą rozpoznawania gestów UICollectionView (tak, aby był to główny gest, a wszystkie inne gesty będą czekać, aż ten gest zakończy się niepowodzeniem przed rozpoznaniem) i dodaj gest do widoku
Nie zapomnij również zaimplementować metod UIGestureRecognizerDelegate, które zawiodą ten gest i zezwalają na jednoczesne rozpoznawanie (możesz lub nie musisz tego implementować, zależy to od innych posiadanych mechanizmów rozpoznawania gestów lub zależności z wewnętrznymi aparatami rozpoznawania gestów)
poświadczenia tego trafiają do wewnętrznej implementacji LXReorderableCollectionViewFlowLayout
źródło
Swift 5:
Nie zapomnij również zaimplementować UIGestureRecognizerDelegate i wywołać setupLongGestureRecognizerOnCollection z viewDidLoad lub gdziekolwiek chcesz to wywołać.
źródło
Być może użycie UILongPressGestureRecognizer jest najbardziej rozpowszechnionym rozwiązaniem. Ale napotykam z nim dwa irytujące problemy:
Pozwólcie, że zasugeruję trochę brutalną siłę, ale działającą zgodnie z wymaganiami:
Deklarowanie opisu oddzwonienia dla długiego kliknięcia na naszą komórkę:
typealias OnLongClickListener = (view: OurCellView) -> Void
Rozszerzanie UICollectionViewCell o zmienne (możemy nazwać go na przykład OurCellView):
Dodanie dwóch metod do naszej klasy komórek:
I nadrzędne zdarzenia dotykowe tutaj:
Następnie gdzieś w kontrolerze naszego widoku kolekcji deklaruje odbiornik wywołań zwrotnych:
I na koniec w cellForItemAtIndexPath ustawienie wywołania zwrotnego dla naszych komórek:
Teraz możemy przechwytywać długie kliknięcia na naszych komórkach.
źródło