Ich habe eine Ansicht, die UIPanGestureRecognizer
die Ansicht vertikal ziehen muss. Im Erkennungsrückruf aktualisiere ich also nur die y-Koordinate, um sie zu verschieben. Die Übersicht dieser Ansicht hat eine UIPanGestureRecognizer
, die die Ansicht horizontal zieht und nur die x-Koordinate aktualisiert.
Das Problem ist, dass der erste UIPanGestureRecognizer
das Ereignis verwendet, um die Ansicht vertikal zu verschieben, sodass ich die Übersichtsgeste nicht verwenden kann.
Ich habe versucht
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
shouldRecognizeSimultaneouslyWithGestureRecognizer:
(UIGestureRecognizer *)otherGestureRecognizer;
und beide werden funktionieren, aber das will ich nicht. Ich möchte, dass die Horizontale nur erkannt wird, wenn die Bewegung eindeutig horizontal ist. Es wäre also toll, wenn die UIPanGestureRecognizer
eine Richtungseigenschaft hätten.
Wie kann ich dieses Verhalten erreichen? Ich finde die Dokumente sehr verwirrend, deshalb kann es hier vielleicht jemand besser erklären.
quelle
Antworten:
Tun Sie dies einfach für den vertikalen Pan-Gesten-Erkenner, es funktioniert für mich:
Und für Swift:
quelle
velocityInView
anstelle von zu verwendentranslationInView
.Ich habe eine Lösung mit Unterklassen wie in der Antwort @LocoMike erstellt, aber den effektiveren Erkennungsmechanismus über die Anfangsgeschwindigkeit verwendet, wie er von @Hejazi bereitgestellt wird. Ich verwende auch Swift, aber dies sollte auf Wunsch leicht in Obj-C zu übersetzen sein.
Vorteile gegenüber anderen Lösungen:
Hier ist der Code:
Anwendungsbeispiel:
quelle
UIPanGestureRecognizer
.let horizontalPanRecognizer = PanDirectionGestureRecognizer(direction: .horizontal, target: self, action: #selector(handleHorizontalPanGesture(recognizer:))) self.view?.addGestureRecognizer(horizontalPanRecognizer); let verticalPanRecognizer = PanDirectionGestureRecognizer(direction: .vertical, target: self, action: #selector(handleVerticalPanGesture(recognizer:))) self.view?.addGestureRecognizer(verticalPanRecognizer);
Ich habe herausgefunden, dass eine Unterklasse von UIPanGestureRecognizer erstellt wurde
DirectionPanGestureRecognizer:
DirectionPanGestureRecognizer.m:
Dies löst die Geste nur aus, wenn der Benutzer das ausgewählte Verhalten einzieht. Setzen Sie die Richtungseigenschaft auf einen korrekten Wert und Sie sind fertig.
quelle
initWithTarget:action:
Methode hinzu und rief reset auf und alles war gut.DirectionPanGestureRecognizer
werden schnelle Drags ignoriert, es sei denn, Sie setzenkDirectionPanThreshold = 20
oder so. In diesem Fall kann es zu Fehlalarmen kommen. Ich schlage vor,abs(_moveX) > abs(_moveY)
stattabs(_moveX) > kDirectionPanThreshold
horizontaler Groß- und Kleinschreibung zu setzen._drag = YES
self.state = UIGestureRecognizerStateChanged;
Ich habe versucht, den gültigen Bereich mit UIPanGestureRecognizer horizontal einzuschränken.
Nur horizontales Wischen innerhalb des Schwellenwerts kann diese Schwenkgeste auslösen.
quelle
Schnelle 3.0-Antwort: Nur Griffe machen die vertikale Geste
quelle
Die folgende Lösung hat mein Problem gelöst:
Dies ist eigentlich nur zu überprüfen, ob Pan in der Hauptansicht oder in der Tabellenansicht ist.
quelle
Schnelle 3-Version von Lees Antwort für die Faulen
quelle
Ich nahm Lee Goodrich ‚s Antwort und erweitert es , wie ich speziell eine einzige Richtung pan benötigt. Verwenden Sie es so:
let pan = PanDirectionGestureRecognizer(direction: .vertical(.up), target: self, action: #selector(handleCellPan(_:)))
Ich habe auch einige Kommentare hinzugefügt, um ein wenig klarer zu machen, welche Entscheidungen tatsächlich getroffen werden.
quelle
override func touchesMoved
-Method does not override any method from its superclass
.Sie können die Richtung finden, die sich
UIView
durchziehtUIPanGestureRecognizer
. Bitte folgen Sie dem Code.quelle
Swift 4.2
Die Lösung besteht nur darin, die Schwenkgeste nur vertikal wie horizontal zu unterstützen.
Lösung 1 :
Lösung 2:
Dann verschluckt die Wischgeste die Schwenkgeste. Natürlich müssen Sie nichts tun
swipeAction
.quelle
So habe ich beschlossen:
Zuerst habe ich die gleichzeitige PanGesture-Erkennung aktiviert.
Dann isoliere ich horizontale und vertikale Schwenkgesten (der Akkumulator ist die Eigenschaft NSMutableArray):
Ich habe hier ein Beispiel angeführt:
Hinzufügen eines benutzerdefinierten Schwenks in der Bildlaufansicht
quelle
quelle
Sie können einfach verwenden
panGestureRecognizer
. Keine Notwendigkeit zu benutzenpandirectionregognizer
oder so. Verwenden Sie einfach den y-Wert vontranslationInview
Unter Code verschieben Sie die Ansicht nur nach oben und untenquelle
Ich habe die Aktionsmethode PanGestureRecognizer @selector für das Objekt erstellt, für das nur horizontales Scrollen erforderlich ist.
quelle
Schneller Weg
quelle
Für alle Swift-Benutzer da draußen wird dies den Job machen :)
quelle
Ich habe eine ausgezeichnete Antwort von Lee Goodrich erhalten und auf Swift 3 portiert
quelle
Ich würde gerne meinen Ansatz teilen, da alle anderen Ansätze entweder auf
UIGestureRecognizerDelegate
oder auf Unterklassen basierenUIPanGestureRecognizer
.Mein Ansatz basiert auf Laufzeit und Swizzling. Ich bin mir bei diesem Ansatz nicht 100% sicher, aber Sie können ihn selbst testen und verbessern.
Stellen Sie die Richtung von jedem
UIPanGestureRecognizer
mit nur einer Codezeile ein:verwenden
pod 'UIPanGestureRecognizerDirection'
oder den Code:quelle
Ich habe das versucht: was bei mir funktioniert hat wie in der Frage beschrieben
quelle
SWIFT 4.2
Ich ging weiter und machte eine Richtung Pan Gesture:
(Verwendet: https://github.com/fastred/SloppySwiper und https://stackoverflow.com/a/30607392/5790492 )
quelle
Hier ist eine benutzerdefinierte Schwenkgeste in Swift 5
U kann seine Richtung und den maximalen Winkel in der Richtung einschränken, Sie können auch seine minimale Geschwindigkeit in der Richtung einschränken.
so anrufen:
oder
quelle
PanGestureRecognizer
Schnittstelle enthält die folgenden Definitionen:Ich habe das nicht überprüft, aber vielleicht ist es über die Unterklasse zugänglich.
quelle