Ich habe ein UIScrollView
nur horizontales Scrollen erlaubt und möchte wissen, in welche Richtung (links, rechts) der Benutzer scrollt. Was ich getan habe, war, UIScrollView
die touchesMoved
Methode zu unterordnen und zu überschreiben :
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesMoved:touches withEvent:event];
UITouch *touch = [touches anyObject];
float now = [touch locationInView:self].x;
float before = [touch previousLocationInView:self].x;
NSLog(@"%f %f", before, now);
if (now > before){
right = NO;
NSLog(@"LEFT");
}
else{
right = YES;
NSLog(@"RIGHT");
}
}
Aber diese Methode wird manchmal überhaupt nicht aufgerufen, wenn ich mich bewege. Was denken Sie?
iphone
ios
cocoa-touch
uiscrollview
Alex1987
quelle
quelle
Antworten:
Das Bestimmen der Richtung ist ziemlich einfach, aber denken Sie daran, dass sich die Richtung im Verlauf einer Geste mehrmals ändern kann. Wenn Sie beispielsweise eine Bildlaufansicht mit aktiviertem Paging haben und der Benutzer wischt, um zur nächsten Seite zu gelangen, kann die Anfangsrichtung nach rechts gerichtet sein. Wenn Sie jedoch den Sprung aktiviert haben, geht sie kurzzeitig in keine Richtung und dann kurz nach links gehen.
Um die Richtung zu bestimmen, müssen Sie den
UIScrollView scrollViewDidScroll
Delegaten verwenden. In diesem Beispiel habe ich eine Variable mit dem Namen erstellt, mitlastContentOffset
der ich den aktuellen Inhaltsoffset mit dem vorherigen vergleiche. Wenn es größer ist, scrollt die scrollView nach rechts. Wenn es weniger ist, scrollt die scrollView nach links:Ich benutze die folgende Aufzählung, um die Richtung zu definieren. Das Setzen des ersten Werts auf ScrollDirectionNone hat den zusätzlichen Vorteil, dass diese Richtung beim Initialisieren von Variablen als Standard festgelegt wird:
quelle
lastContentOffset = scrollView.contentOffset.x;
lastContentOffset
Typ. In Bezug auf Eigenschaften und statische Variablen: Jede Lösung ist eine gute Wahl. Ich habe keine wirkliche Präferenz. Das ist ein guter Punkt.Verwenden Sie in diesem Fall unter iOS 5 und höher die
UIScrollViewDelegate
, um die Richtung der Schwenkgeste des Benutzers zu bestimmen:quelle
Verwenden von
scrollViewDidScroll:
ist eine gute Möglichkeit, die aktuelle Richtung zu ermitteln.Wenn Sie die Richtung wissen möchten, nachdem der Benutzer den Bildlauf beendet hat, verwenden Sie Folgendes:
quelle
Sie müssen keine zusätzliche Variable hinzufügen, um dies zu verfolgen. Verwenden Sie einfach die
UIScrollView
‚spanGestureRecognizer
Eigenschaft wie folgt. Leider funktioniert dies nur, wenn die Geschwindigkeit nicht 0 ist:Sie können eine Kombination aus x- und y-Komponenten verwenden, um nach oben, unten, links und rechts zu erkennen.
quelle
Die Lösung
quelle
velocityInView
statttranslationInView
. Dies löst das Problem, das beim Richtungswechsel in derselben Bewegung auftritt.Swift 4:
Für das horizontale Scrollen können Sie einfach Folgendes tun:
Für vertikales Scrollen ändern Sie
.x
mit.y
quelle
In iOS8 Swift habe ich diese Methode verwendet:
Ich habe eine dynamische Ansicht, die beim Scrollen des Benutzers die Position ändert, sodass die Ansicht so aussehen kann, als ob sie an derselben Stelle auf dem Bildschirm geblieben wäre. Ich verfolge auch, wann der Benutzer nach oben oder unten geht.
Hier ist auch ein alternativer Weg:
quelle
crollViewDidEndDecelerating
richtig erkennen?Das hat bei mir funktioniert (in Ziel-C):
quelle
quelle
Alternativ ist es möglich, den Schlüsselpfad "contentOffset" zu beobachten. Dies ist nützlich, wenn Sie den Delegaten der Bildlaufansicht nicht festlegen / ändern können.
Nachdem Sie den Beobachter hinzugefügt haben, können Sie jetzt:
Denken Sie daran, den Beobachter bei Bedarf zu entfernen. zB könnten Sie den Beobachter in hinzufügen viewWillAppear und entfernen Sie sie in viewWillDisappear
quelle
In Kürze:
Sie können dies auch in scrollViewDidScroll tun.
quelle
Hier ist meine Lösung für Verhalten wie in @followben Antwort, aber ohne Verlust bei langsamem Start (wenn dy 0 ist)
quelle
Ich habe einen Teil der Antwort überprüft und die AnswerBot-Antwort ausgearbeitet, indem ich alles in einen Drop in der Kategorie UIScrollView eingeschlossen habe. Das "lastContentOffset" wird stattdessen in der uiscrollview gespeichert und muss dann nur noch aufgerufen werden:
Quellcode unter https://github.com/tehjord/UIScrollViewScrollingDirection
quelle
Ich ziehe es vor, basierend auf der Antwort von @ memmons zu filtern
In Ziel-C:
Beim Testen in
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
:self.lastContentOffset
ändert sich sehr schnell, die Wertlücke beträgt fast 0.5f.Es ist nicht erforderlich.
Und gelegentlich kann Ihre Orientierung verloren gehen, wenn Sie in genauem Zustand behandelt werden. (Implementierungsanweisungen werden manchmal übersprungen)
sowie :
In Swift 4:
quelle
Wenn Paging aktiviert ist, können Sie diesen Code verwenden.
quelle
Codes erklärt sich wohl selbst. CGFloat-Differenz1 und -Differenz2 werden in derselben privaten Schnittstelle der Klasse deklariert. Gut, wenn contentSize gleich bleibt.
quelle
Ok, für mich funktioniert diese Implementierung wirklich gut:
Dadurch wird textView ausgelöst und nach dem Ende des Ziehens geschlossen
quelle
Verwenden Sie diese Delegatmethode für die Bildlaufansicht.
Wenn Ihre Geschwindigkeitskoordinate + ve ist, wird die Bildlaufansicht nach unten und bei -ve Bildlaufansicht nach oben gescrollt. In ähnlicher Weise kann der linke und rechte Bildlauf mit der x-Koordinate erkannt werden.
quelle
Short & Easy wäre, überprüfen Sie einfach den Geschwindigkeitswert, wenn er größer als Null ist, dann scrollen Sie nach links oder rechts:
quelle
Wenn Sie mit UIScrollView und UIPageControl arbeiten, ändert diese Methode auch die Seitenansicht von PageControl.
Vielen Dank an den Swift-Code von @Esq.
quelle
Swift 2.2 Einfache Lösung, die einzelne und mehrere Richtungen ohne Verlust verfolgt.
quelle
In allen oberen Antworten verwenden
panGestureRecognizer
oder verwenden zwei Hauptmethoden zur Lösung des ProblemscontentOffset
. Beide Methoden haben ihre Vor- und Nachteile.Methode 1: panGestureRecognizer
Wenn Sie
panGestureRecognizer
wie von @followben vorgeschlagen verwenden und Ihre Bildlaufansicht nicht programmgesteuert scrollen möchten, funktioniert dies ordnungsgemäß.Nachteile
Wenn Sie jedoch die Bildlaufansicht mit folgendem Code verschieben, kann der obere Code ihn nicht erkennen:
Methode 2: contentOffset
Nachteile
Wenn Sie contentOffset während des Bildlaufs programmgesteuert ändern möchten (z. B. wenn Sie einen unendlichen Bildlauf erstellen möchten), ist diese Methode problematisch, da Sie
contentOffset
beim Ändern der Positionen der Inhaltsansichten möglicherweise Änderungen vornehmen und in dieser Zeit der obere Code springt, indem Sie nach rechts oder scrollen links.quelle
Antwort von Mos6y https://medium.com/@Mos6yCanSwift/swift-ios-determine-scroll-direction-d48a2327a004
quelle