Ziel c
Fügen Sie in Ihrer myCollectionViewController.h
Datei das UIGestureRecognizerDelegate
Protokoll hinzu
@interface myCollectionViewController : UICollectionViewController<UIGestureRecognizerDelegate>
in Ihrer myCollectionViewController.m
Datei:
- (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
}
}
Schnell
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))
Swift 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];
Referenz hier hoffe, all dieslpgr.delaysTouchesBegan = YES;
, um zu vermeiden,didHighlightItemAtIndexPath
dass zuerst ausgelöst wird.lpgr.delegate = self;
? Es funktioniert gut ohne Delegierten, die Sie auch nicht angegeben haben.UIGestureRecognizerStateBegan
, also wird die Geste verwendet, wenn sie erkannt wird, nicht wenn der Benutzer seinen Finger loslässt.Der gleiche Code @ abboods Code für Swift:
In viewDidLoad:
Und die Funktion:
Vergessen Sie den Delegierten nicht
UIGestureRecognizerDelegate
quelle
UIGestureRecognizerState.Ended
zu,UIGestureRecognizerState.Began
wenn der Code nach Ablauf der Mindestdauer ausgelöst werden soll, nicht nur, wenn der Benutzer seinen Finger aufnimmt.Verwenden Sie den Delegaten von UICollectionView, um eine lange Presseveranstaltung zu erhalten
Sie müssen 3 Methode unten implizieren.
quelle
Die Antworten hier zum Hinzufügen eines benutzerdefinierten Longpress-Gestenerkenners sind jedoch gemäß der Dokumentation hier korrekt : Die übergeordnete Klasse der
UICollectionView
Klasse installiert adefault long-press gesture recognizer
, um Bildlaufinteraktionen zu verarbeiten. Sie müssen Ihren benutzerdefinierten Tippgestenerkenner also mit dem Standarderkenner verknüpfen, der Ihrer Sammlungsansicht zugeordnet ist.Mit dem folgenden Code wird verhindert, dass Ihre benutzerdefinierte Gestenerkennung die Standarderkennung beeinträchtigt:
quelle
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.
es in der Dokumentation: Der Standard-Langdruckerkenner ist für das Scrollen vorgesehen. Dies bedeutet, dass er mit einer vertikalen Bewegung einhergehen muss. Das OP fragt nicht über diese Art von Verhalten noch versucht er, es zu ersetzenund fügen Sie die Methode wie folgt hinzu.
quelle
Um einen externen Gestenerkenner zu haben und nicht mit internen Gestenerkennern in der UICollectionView in Konflikt zu stehen, müssen Sie:
Fügen Sie Ihren Gestenerkenner hinzu, richten Sie ihn ein und erfassen Sie irgendwo eine Referenz dafür (die beste Option ist in Ihrer Unterklasse, wenn Sie UICollectionView unterklassifiziert haben).
Außer Kraft setzen Standardinitialisierung Methoden
initWithFrame:collectionViewLayout:
undinitWithCoder:
und fügen Sie lange drücken Gestenerkenner einrichten MethodeSchreiben Sie Ihre Setup-Methode so, dass sie die Gestenerkennung mit langem Druck instanziiert, ihren Delegaten festlegt, Abhängigkeiten mit der UICollectionView-Gestenerkennung einrichtet (es handelt sich also um die Hauptgeste, und alle anderen Gesten warten, bis diese Geste fehlschlägt, bevor sie erkannt wird), und fügen Sie der Ansicht eine Geste hinzu
Vergessen Sie auch nicht, UIGestureRecognizerDelegate-Methoden zu implementieren, die diese Geste nicht bestehen und die gleichzeitige Erkennung ermöglichen (möglicherweise müssen Sie sie implementieren oder nicht, dies hängt von anderen Gestenerkennern oder Abhängigkeiten mit internen Gestenerkennern ab).
Die Anmeldeinformationen dafür gehen an die interne Implementierung von LXReorderableCollectionViewFlowLayout
quelle
Swift 5:
Vergessen Sie auch nicht, UIGestureRecognizerDelegate zu implementieren und setupLongGestureRecognizerOnCollection von viewDidLoad oder von jedem Ort aus aufzurufen, an dem Sie es aufrufen müssen.
quelle
Möglicherweise ist die Verwendung von UILongPressGestureRecognizer die am weitesten verbreitete Lösung. Aber ich stoße damit auf zwei nervige Probleme:
Lassen Sie mich ein wenig Bruteforce vorschlagen, aber so arbeiten, wie es erforderlich ist:
Eine Rückrufbeschreibung für einen langen Klick auf unsere Zelle deklarieren:
typealias OnLongClickListener = (view: OurCellView) -> Void
Erweitern von UICollectionViewCell um Variablen (wir können es beispielsweise OurCellView nennen):
Hinzufügen von zwei Methoden in unserer Zellklasse:
Und übergeordnete Berührungsereignisse hier:
Dann irgendwo in der Steuerung unserer Sammlungsansicht, die den Rückruf-Listener deklariert:
Und schließlich in cellForItemAtIndexPath Rückruf für unsere Zellen festlegen :
Jetzt können wir lange Klickaktionen auf unseren Zellen abfangen.
quelle