UIScrollViewDelegate hat zwei Delegatmethoden bekam scrollViewDidScroll:
und scrollViewDidEndScrollingAnimation:
aber keines von beiden sagen , wann abgeschlossen hat Scrollen. scrollViewDidScroll
benachrichtigt Sie nur darüber, dass die Bildlaufansicht nicht gescrollt wurde.
Die andere Methode scrollViewDidEndScrollingAnimation
scheint nur ausgelöst zu werden, wenn Sie die Bildlaufansicht programmgesteuert verschieben, nicht, wenn der Benutzer einen Bildlauf durchführt.
Kennt jemand ein Schema, um zu erkennen, wann eine Bildlaufansicht den Bildlauf abgeschlossen hat?
ios
iphone
uiscrollview
Michael Gaylord
quelle
quelle
Antworten:
quelle
Die 320 Implementierungen sind so viel besser - hier ist ein Patch, um konsistente Starts / Enden des Bildlaufs zu erhalten.
quelle
Ich denke, scrollViewDidEndDecelerating ist das, was Sie wollen. Die optionale Methode UIScrollViewDelegates:
Zeigt dem Delegierten an, dass die Bildlaufansicht die Bildlaufbewegung verlangsamt hat.
UIScrollViewDelegate-Dokumentation
quelle
Für alle Schriftrollen, die sich auf das Ziehen von Interaktionen beziehen, ist dies ausreichend:
Wenn Ihr Bildlauf auf ein programmatisches setContentOffset / scrollRectVisible zurückzuführen ist (mit
animated
= YES oder Sie wissen offensichtlich, wann der Bildlauf beendet ist):Wenn Ihre Schriftrolle auf etwas anderes zurückzuführen ist (z. B. Öffnen oder Schließen der Tastatur), müssen Sie das Ereignis anscheinend mit einem Hack erkennen, da dies ebenfalls
scrollViewDidEndScrollingAnimation
nicht hilfreich ist.Der Fall einer PAGINIERTEN Bildlaufansicht :
Da Apple vermutlich eine Beschleunigungskurve anwendet, wird
scrollViewDidEndDecelerating
es für jeden Widerstand aufgerufen, sodassscrollViewDidEndDragging
in diesem Fall keine Verwendung erforderlich ist.quelle
scrollViewDidEndDecelerating
wird es nicht aufgerufenDies wurde in einigen anderen Antworten beschrieben, aber hier ist (im Code), wie man kombiniert
scrollViewDidEndDecelerating
undscrollViewDidEndDragging:willDecelerate
einige Operationen ausführt, wenn das Scrollen beendet ist:quelle
Ich habe gerade erst diese Frage gefunden, die ziemlich genau dieselbe ist, die ich gestellt habe: Woher weiß ich genau, wann das Scrollen eines UIScrollView gestoppt wurde?
Obwohl didEndDecelerating beim Scrollen funktioniert, wird das Schwenken mit stationärer Freigabe nicht registriert.
Ich habe schließlich eine Lösung gefunden. didEndDragging hat einen Parameter WillDecelerate, der in der stationären Release-Situation falsch ist.
Wenn Sie in DidEndDragging in Kombination mit didEndDecelerating nach! Decelerate suchen, erhalten Sie beide Situationen, in denen das Scrollen beendet ist.
quelle
quelle
Wenn Sie Rx mögen, können Sie UIScrollView folgendermaßen erweitern:
Damit können Sie einfach so vorgehen:
Dies berücksichtigt sowohl das Ziehen als auch das Abbremsen.
quelle
Ich habe die Antwort von Ashley Smart ausprobiert und es hat wie ein Zauber funktioniert. Hier ist eine andere Idee, bei der nur scrollViewDidScroll verwendet wird
Ich hatte gerade zwei Seiten, also hat es bei mir funktioniert. Wenn Sie jedoch mehr als eine Seite haben, kann dies problematisch sein (Sie können überprüfen, ob der aktuelle Versatz ein Vielfaches der Breite beträgt, aber Sie wissen dann nicht, ob der Benutzer auf der 2. Seite angehalten hat oder auf dem Weg zur 3. oder ist Mehr)
quelle
Schnelle Version der akzeptierten Antwort:
quelle
Wenn jemand braucht, hier ist Ashley Smart Antwort in Swift
quelle
Gerade entwickelte Lösung zum Erkennen beim Scrollen in der gesamten App: https://gist.github.com/k06a/731654e3168277fb1fd0e64abc7d899e
Es basiert auf der Idee, Änderungen von Runloop-Modi zu verfolgen. Führen Sie Blöcke mindestens nach 0,2 Sekunden nach dem Scrollen aus.
Dies ist die Kernidee für die Verfolgung von Änderungen im Runloop-Modus. IOS10 +:
Und Lösung für Ziele mit geringer Bereitstellung wie iOS2 +:
quelle
Um es noch einmal zusammenzufassen (und für Neulinge). Es ist nicht so schmerzhaft. Fügen Sie einfach das Protokoll und dann die Funktionen hinzu, die Sie zur Erkennung benötigen.
Fügen Sie in der Ansicht (Klasse), die UIScrolView enthält, das Protokoll hinzu und fügen Sie dann alle Funktionen von hier zu Ihrer Ansicht (Klasse) hinzu.
quelle
Ich hatte einen Fall von Tippen und Ziehen von Aktionen und fand heraus, dass das Ziehen scrollViewDidEndDecelerating aufrief
Und der Änderungsversatz manuell mit Code ([_scrollView setContentOffset: contentOffset animiert: YES];) rief scrollViewDidEndScrollingAnimation auf.
quelle
Eine Alternative wäre die Verwendung,
scrollViewWillEndDragging:withVelocity:targetContentOffset
die aufgerufen wird, wenn der Benutzer den Finger hebt und den Versatz des Zielinhalts enthält, an dem der Bildlauf angehalten wird. Wenn Sie diesen Inhaltsversatz verwenden, wirdscrollViewDidScroll:
korrekt identifiziert, wann die Bildlaufansicht aufgehört hat zu scrollen.quelle
UIScrollview verfügt über eine Delegatmethode
Fügen Sie der Delegate-Methode die folgenden Codezeilen hinzu
quelle
Es gibt eine Methode, mit
UIScrollViewDelegate
der erkannt werden kann (oder besser gesagt "Vorhersagen"), wenn das Scrollen wirklich beendet ist:von
UIScrollViewDelegate
denen verwendet werden kann (oder besser ‚vorhersagen‘ zu sagen) zu erkennen , wenn das Scrollen wirklich beendet ist.In meinem Fall habe ich es mit horizontalem Scrollen wie folgt verwendet (in Swift 3 ):
quelle
Verwendet Ashley Smart-Logik und wird in Swift 4.0 und höher konvertiert.
Die obige Logik löst Probleme, z. B. wenn der Benutzer aus der Tabellenansicht blättert. Ohne die Logik wird beim Scrollen aus der Tabellenansicht
didEnd
aufgerufen, aber es wird nichts ausgeführt. Derzeit wird es im Jahr 2020 verwendet.quelle
Bei einigen früheren iOS-Versionen (wie iOS 9, 10)
scrollViewDidEndDecelerating
wird dies nicht ausgelöst, wenn die scrollView plötzlich durch Berühren gestoppt wird.Aber in der aktuellen Version (iOS 13)
scrollViewDidEndDecelerating
wird sicher ausgelöst (soweit ich weiß).Wenn Ihre App auch auf frühere Versionen abzielt, benötigen Sie möglicherweise eine Problemumgehung wie die von Ashley Smart erwähnte oder die folgende.
Erläuterung
UIScrollView wird auf drei Arten
gestoppt : - schnell gescrollt und von selbst gestoppt
- schnell gescrollt und per Fingerberührung gestoppt (wie Notbremse)
- langsam gescrollt und gestoppt
Die erste kann mit
scrollViewDidEndDecelerating
ähnlichen Methoden erkannt werden, die anderen beiden nicht.Glücklicherweise
UIScrollView
haben wir drei Status, mit denen wir sie identifizieren können. Dies wird in den beiden Zeilen verwendet, die mit "// 1" und "// 2" kommentiert sind.quelle