Hinweis: Die hier gegebene Antwort funktioniert bei mir nicht.
Ich habe eine UIScrollView (keine Tabellenansicht, nur eine benutzerdefinierte Sache), und wenn der Benutzer bestimmte Aktionen ausführt, möchte ich das Scrollen (Ziehen oder Verzögern) in der Ansicht beenden. Ich habe versucht, zB folgendes zu tun:
[scrollView scrollRectToVisible:CGRectInset([scrollView bounds], 10, 10) animated:NO];
Nach der Theorie, dass bei einem bereits bekannten Rechteck das Scrollen nur dort anhält, wo es ist, aber es stellt sich heraus, dass dies keine Auswirkung hat - anscheinend sieht die Bildlaufansicht, dass das angegebene Rechteck in Grenzen ist und dauert keine Aktion. Ich kann den Bildlauf stoppen lassen, wenn ich ein Rechteck gebe, das definitiv außerhalb der aktuell sichtbaren Grenzen liegt, aber innerhalb der Inhaltsgröße der Ansicht. Dies scheint die Ansicht wie erwartet anzuhalten ... führt aber auch dazu, dass sie an einen anderen Ort springt. Ich könnte wahrscheinlich ein wenig am Rand herumspielen, damit dies einigermaßen funktioniert. Aber kennt jemand einen sauberen Weg, um eine Bildlaufansicht anzuhalten, die ihre Sache macht?
Vielen Dank.
quelle
setContentOffset
ausreicht. Die Bildlaufansicht rundet den Inhaltsversatz automatisch auf.Die generische Antwort lautet: Das
[scrollView setContentOffset:offset animated:NO]
ist nicht dasselbe wie[scrollView setContentOffset:offset]
![scrollView setContentOffset:offset animated:NO]
stoppt tatsächlich jede laufende Animation.[scrollView setContentOffset:offset]
stoppt keine laufende Animation.scrollView.contentOffset = offset
: Stoppt keine laufende Animation.Das ist nirgendwo dokumentiert, aber das ist das Verhalten, wie es unter iOS 6.1 und iOS 7.1 getestet wurde - wahrscheinlich auch vorher.
Die Lösung zum Stoppen einer laufenden Animation / Verzögerung ist also so einfach:
Grundsätzlich, was David Liu in seiner bearbeiteten Antwort gesagt hat. Aber ich wollte klarstellen, dass diese beiden APIs NICHT gleich sind.
Swift 3:
quelle
Für mich hat die oben akzeptierte Antwort von David Lui bei mir nicht funktioniert. Das habe ich letztendlich getan:
Für das, was es wert ist, benutze ich den iOS 6.0 iPhone Simulator.
quelle
supportedInterfaceOrientations
, um zu verhindern, dass die Bildlaufereignisse fortgesetzt werden, wenn der Benutzer das Gerät während des Bildlaufs dreht. Dies ist manchmal ein Chaos, je nachdem, was Sie tun.Folgendes mache ich für meine Bildlaufansichten und alle anderen verwandten Unterklassen:
Damit wird die
targetContentOffset
auf denscrollView
‚aktuellen Offset, wodurch das Scrollen zu stoppen , weil er das Ziel erreicht hat. Es ist tatsächlich sinnvoll, eine Methode zu verwenden, deren Zweck darin besteht, dass Benutzer das Ziel festlegen könnencontentOffset
.Schnell
quelle
Stoppen Sie die Schriftrolle schnell :
quelle
Eigentlich ... Der "modernste" Weg wäre ->
Dadurch wird die Gestenerkennung deaktiviert, die für einen Moment für das Scrollen verantwortlich ist, wodurch die aktuelle Berührung beendet wird. Der Benutzer müsste den Finger heben und wieder nach unten legen, um erneut mit dem Scrollen zu beginnen.
Bearbeiten: Dies beendet nur das aktuelle Ziehen des Benutzers, stoppt jedoch nicht sofort die Verzögerung, wenn sich die Bildlaufansicht derzeit in diesem Zustand befindet. Um dies zu tun, ist die Bearbeitung der akzeptierten Antworten so ziemlich der beste Weg xD
quelle
Am saubersten ist es, UIScrollView in Unterklassen zu unterteilen und Ihre eigene setContentOffset-Methode bereitzustellen. Dies sollte die Nachricht nur weiterleiten, wenn Sie Ihre
freeze
boolesche Eigenschaft nicht aktiviert haben.Wie so:
Dann einfrieren:
quelle
decelerationRate = 1e10;
während des Einfrierens zappen == JA?Diese Antwort hat bei mir funktioniert: Deaktivieren Sie die UIScrollView-Verzögerung
quelle
Deaktivieren Sie einfach die Benutzerinteraktion. (schnell)
Deaktivieren Sie diese Option während der Bildlaufanimation nach dem Ziehen. (schnell)
quelle
Ich habe diese Methoden in der Sammlungsansicht ausprobiert:
self.collectionView.collectionViewLayout.finalizeCollectionViewUpdates()
quelle
Dies funktioniert bei mir in Swift 4.2 :
... als Erweiterung:
quelle
Ich wollte das Scrollen nur deaktivieren, wenn eine bestimmte UIView in der Scrollansicht die Quelle der Berührung während des Wischens ist. Das Verschieben der UIView außerhalb der UIScrollView hätte einige Umgestaltungen erforderlich gemacht, da wir eine komplexe Ansichtshierarchie hatten.
Um dieses Problem zu umgehen, habe ich der Unteransicht, in der ich das Scrollen verhindern wollte, einen einzelnen UIPanGestureRecognizer hinzugefügt. Dieser UIPanGestureRecognizer
cancelsTouchesInView
verhindert, dass die panGesture von UIScrollView aktiviert wird.Es ist ein bisschen wie ein "Hack", aber es ist eine super einfache Änderung. Wenn Sie ein XIB oder Storyboard verwenden, müssen Sie nur die Schwenkgeste auf die betreffende Unteransicht ziehen.
quelle