Ich muss eine Funktion implementieren, die Code aufruft, wenn ich zweimal auf die self.view (Ansicht von UIViewCotroller
) tippe . Aber das Problem, dass ich ein anderes UI-Objekt in dieser Ansicht habe und kein Erkennungsobjekt an alle anhängen möchte. Ich habe diese Methode unten gefunden, um Gesten in meiner Ansicht zu machen, und ich weiß, wie es funktioniert. Im Moment bin ich vor dem Handicap, welchen Weg ich wählen soll, um diesen Erkenner zu erstellen, ohne die Unteransicht zu beachten. Irgendwelche Ideen? Vielen Dank.
UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTap:)];
[doubleTap setNumberOfTapsRequired:2];
[self.view addGestureRecognizer:doubleTap];
ios
uitapgesturerecognizer
Matrosov Alexander
quelle
quelle
Antworten:
Sie sollten das
UIGestureRecognizerDelegate
Protokoll imself
Objekt übernehmen und die folgende Methode zum Überprüfen der Ansicht aufrufen. Überprüfen Sie bei dieser Methode Ihre Ansicht mittouch.view
und geben Sie den entsprechenden Bool zurück (Ja / Nein). Etwas wie das:Bearbeiten: Bitte überprüfen Sie auch @ Ians Antwort!
Swift 5
quelle
-[UIGestureRecognizer requireGestureRecognizerToFail:]
aber es könnte funktionieren, ohne sie zu ändernif
Test fehlschlägt, gibt Ihre Implementierung kein BOOL zurück. Für den richtigen Stil geben Sie JA nach einem if-Block (using{ }
) oder in einemelse
Zweig zurück. Vielen Dank, ersparte mir ein bisschen Lesen.Ein anderer Ansatz besteht darin, nur zu vergleichen, ob die Ansicht der Berührung die Gestenansicht ist, da Nachkommen die Bedingung nicht erfüllen. Ein schöner, einfacher Einzeiler:
quelle
Und für die Swift-Variante:
Gut zu wissen,
isDescendantOfView
gibt einenBoolean
Wert zurück, der angibt, ob der Empfänger eine Unteransicht einer bestimmten Ansicht ist oder mit dieser Ansicht identisch ist.quelle
Mit Swift 5 und iOS 12
UIGestureRecognizerDelegate
wird eine Methode aufgerufengestureRecognizer(_:shouldReceive:)
.gestureRecognizer(_:shouldReceive:)
hat die folgende Erklärung:Der vollständige Code unten zeigt eine mögliche Implementierung für
gestureRecognizer(_:shouldReceive:)
. Mit diesem Code wird durch Tippen auf eine Unteransicht derViewController
Ansicht (einschließlichimageView
) dieprintHello(_:)
Methode nicht ausgelöst .Eine alternative Implementierung von
gestureRecognizer(_:shouldReceive:)
kann sein:Beachten Sie jedoch, dass dieser alternative Code nicht prüft, ob
touch.view
es sich um eine Unteransicht von handeltgestureRecognizer.view
.quelle
Komplette schnelle Lösung (Delegat muss implementiert UND für Erkenner festgelegt sein):
quelle
Variante mit CGPoint, die Sie berühren (SWIFT 4.0)
quelle
Schneller Weg
quelle
Beachten Sie, dass die gestureRecognizer-API geändert wurde in:
gestureRecognizer (_: shouldReceive :)
Beachten Sie insbesondere den Unterstrich (Überspringen) für die externe Beschriftung des ersten Parameters.
Anhand vieler der oben aufgeführten Beispiele erhielt ich die Veranstaltung nicht. Unten finden Sie ein Beispiel, das für aktuelle Versionen von Swift (3+) funktioniert.
quelle
Vergessen Sie bei den oben genannten Lösungen nicht,
User Interaction Enabled
Ihre Unteransicht zu überprüfen .quelle
Ich musste die Geste in der Kinderansicht verhindern. Das einzige, was funktioniert hat, ist, die erste Ansicht zuzulassen und beizubehalten und Gesten in allen nächsten Ansichten zu verhindern:
quelle
Swift 4:
touch.view
ist jetzt optional, also basierend auf der Antwort von @ Antoine:quelle
Wenn Sie nicht Ihren wollen ‚Doppel-Tap Erkenner‘ zu einem Konflikt mit Tasten und / oder anderen Steuerelemente können Sie einstellen ,
self
wieUIGestureRecognizerDelegate
und implementieren:quelle