Ich möchte meinem ansichtsbasierten iPhone-Projekt eine einfache Wischgestenerkennung hinzufügen. Gesten in alle Richtungen (rechts, unten, links, oben) sollten erkannt werden.
In den Dokumenten für UISwipeGestureRecognizer wird Folgendes angegeben:
Sie können mehrere Richtungen angeben, indem Sie mehrere UISwipeGestureRecognizerDirection-Konstanten mit bitweisen ODER-Operanden angeben. Die Standardrichtung ist UISwipeGestureRecognizerDirectionRight.
Bei mir funktioniert es jedoch nicht. Wenn alle vier Richtungen ODER-verknüpft sind, werden nur linke und rechte Wischbewegungen erkannt.
- (void)viewDidLoad {
UISwipeGestureRecognizer *recognizer;
recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
[recognizer setDirection:(UISwipeGestureRecognizerDirectionRight | UISwipeGestureRecognizerDirectionDown | UISwipeGestureRecognizerDirectionLeft | UISwipeGestureRecognizerDirectionUp)];
[[self view] addGestureRecognizer:recognizer];
[recognizer release];
[super viewDidLoad];
}
-(void)handleSwipeFrom:(UISwipeGestureRecognizer *)recognizer {
NSLog(@"Swipe received.");
}
Ich habe dies behoben, indem ich der Ansicht vier Erkenner hinzugefügt habe, aber ich bin gespannt, warum es nicht wie in den Dokumenten angegeben funktioniert hat.
- (void)viewDidLoad {
UISwipeGestureRecognizer *recognizer;
recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
[recognizer setDirection:(UISwipeGestureRecognizerDirectionRight)];
[[self view] addGestureRecognizer:recognizer];
[recognizer release];
recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
[recognizer setDirection:(UISwipeGestureRecognizerDirectionUp)];
[[self view] addGestureRecognizer:recognizer];
[recognizer release];
recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
[recognizer setDirection:(UISwipeGestureRecognizerDirectionDown)];
[[self view] addGestureRecognizer:recognizer];
[recognizer release];
recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
[recognizer setDirection:(UISwipeGestureRecognizerDirectionLeft)];
[[self view] addGestureRecognizer:recognizer];
[recognizer release];
[super viewDidLoad];
}
-(void)handleSwipeFrom:(UISwipeGestureRecognizer *)recognizer {
NSLog(@"Swipe received.");
}
quelle
Antworten:
Scheint, als gäbe es einen Fehler. Sie können die zulässige (n) Richtung (en) wie angegeben angeben. Wenn Sie jedoch versuchen, auf die tatsächliche Richtung zuzugreifen , die das Wischen in der Aktionsauswahlmethode ausgelöst hat, erhalten Sie immer noch die ursprünglich festgelegte Bitmaske (für die zulässigen Richtungen).
Dies bedeutet, dass die Überprüfung der tatsächlichen Richtung immer fehlschlägt, wenn mehr als eine Richtung zulässig ist. Sie können es ganz leicht selbst sehen, wenn Sie den Wert 'Richtung' in der Auswahlmethode (dh
-(void)scrollViewSwiped:(UISwipeGestureRecognizer *)recognizer
) ausgeben .Hat einen Fehlerbericht (# 8276386) an Apple gesendet.
[Update] Ich habe eine Antwort von Apple erhalten, dass das Verhalten wie beabsichtigt funktioniert.
So können Sie beispielsweise in einer Tabellenansicht in einer Tabellenansichtszelle nach links oder rechts wischen, um "Löschen" auszulösen (hier wäre die Richtung der Wischgeste auf links und rechts eingestellt).
Dies bedeutet, dass die ursprüngliche Problemumgehung so ist, wie sie verwendet werden soll. Die Richtungseigenschaft kann nur verwendet werden, um die Gesten korrekt zu erkennen, nicht jedoch bei der Methode, die bei einer erfolgreichen Erkennung ausgeführt wird, um die tatsächliche Richtung zu vergleichen, die die Erkennung ausgelöst hat.
quelle
Mir ist aufgefallen, dass die Gesten links / rechts und oben / unten paarweise zusammenarbeiten, sodass Sie nur zwei Gestenerkenner angeben müssen. Und die Dokumente scheinen falsch zu sein.
quelle
Nun, das ist scheiße, ich habe das Problem gelöst, indem ich 2 Gesten hinzugefügt habe, wie Lars es erwähnt hat, und das hat perfekt funktioniert ...
1) Links / Rechts 2) Auf / Ab
quelle
Dies ist die didSwipe-Funktion
quelle
Wenn Sie Xcode 4.2 verwenden, können Sie Gestenerkenner im Storyboard hinzufügen und dann die GUI-Gestenerkenner mit IBActions verknüpfen.
Sie finden die Gestenerkenner in der Objektbibliothek des Utility-Bereichs (unten im rechten Bereich).
Dann ist es nur noch eine Frage des Strichziehens zur entsprechenden Aktion.
quelle
Wenn Sie möchten, dass alle vier Richtungen erkannt werden, müssen Sie wie bei Ihrer Umgehung vier Instanzen erstellen.
Hier ist der Grund: Dieselbe Instanz von UISwipeGestureRecognizer, die Sie erstellen, ist die Instanz, die als Absender an den Selektor übergeben wird. Wenn Sie also festlegen, dass alle vier Richtungen erkannt werden, wird true für zurückgegeben
sgr.direction == xxx
wenn xxx eine der vier Richtungen ist.Hier ist eine alternative Problemumgehung , die weniger Code erfordert (setzt die Verwendung von ARC voraus):
quelle
Hier ist ein Codebeispiel für die Verwendung von UISwipeGestureRecognizer. Kommentare beachten.
swipeRight und swipeLeft sind Methoden, mit denen Sie bestimmte Aktivitäten basierend auf dem Wischen nach links oder rechts ausführen. Beispielsweise:
quelle
quelle
Swift 2.1
Ich musste folgendes verwenden
quelle
hmm, seltsam, es funktioniert perfekt für mich, ich mache genau das gleiche
denke, du solltest es dir ansehen
UIGestureRecognizerDelegate-Methode
In Protokollen müssen Sie Folgendes sehen:
sollte Geste beginnen; target = <(action = actionForUpDownSwipeGestureRecognizer:, target =)>; Richtung = oben, unten, links, rechts>
quelle
Verwenden Sie dies, es sollte die Bit-Operation sein
quelle
Das hat mich verrückt gemacht. Ich habe endlich einen zuverlässigen Weg gefunden, um mehrere swipeGestureRecognizer zu haben.
Es scheint, dass es in iOS einen Fehler gibt, wenn der Name Ihres "Aktions" -Selektors für mehrere swipeGestureRecognizer gleich ist. Wenn Sie sie nur anders benennen, z. B. handleLeftSwipeFrom und handleRightSwipeFrom, funktioniert alles.
quelle