Ich habe UICollectionView
mit horizontalem Scrollen und es gibt immer 2 Zellen nebeneinander pro gesamten Bildschirm. Ich brauche das Scrollen, um am Anfang einer Zelle anzuhalten. Wenn Paging aktiviert ist, scrollt die Sammlungsansicht die gesamte Seite, die aus 2 Zellen gleichzeitig besteht, und stoppt dann.
Ich muss das Scrollen durch eine einzelne Zelle oder das Scrollen durch mehrere Zellen mit Anhalten am Rand der Zelle aktivieren.
Ich habe versucht, UICollectionViewFlowLayout
die Methode in Unterklassen zu unterteilen und zu implementieren targetContentOffsetForProposedContentOffset
, aber bisher konnte ich nur meine Sammlungsansicht unterbrechen und das Scrollen wurde gestoppt. Gibt es einen einfacheren Weg, dies zu erreichen und wie, oder muss ich wirklich alle Methoden der UICollectionViewFlowLayout
Unterklasse implementieren ? Vielen Dank.
quelle
targetContentOffsetForProposedContentOffset:withScrollingVelocity:
und deaktivieren Sie PagingAntworten:
OK, also habe ich hier die Lösung gefunden: targetContentOffsetForProposedContentOffset: withScrollingVelocity ohne Unterklasse UICollectionViewFlowLayout
Ich hätte
targetContentOffsetForProposedContentOffset
am Anfang suchen sollen .quelle
Überschreiben Sie einfach die Methode:
quelle
Horizontales Paging mit benutzerdefinierter Seitenbreite (Swift 4 & 5)
Viele der hier vorgestellten Lösungen führen zu einem seltsamen Verhalten, das sich nicht wie richtig implementiertes Paging anfühlt.
Die in diesem Tutorial vorgestellte Lösung scheint jedoch keine Probleme zu haben. Es fühlt sich einfach wie ein perfekt funktionierender Paging-Algorithmus an. Sie können es in 5 einfachen Schritten implementieren:
private var indexOfCellBeforeDragging = 0
collectionView
delegate
Folgendes ein:collectionView.delegate = self
UICollectionViewDelegate
über eine Erweiterung hinzufügen:extension YourType: UICollectionViewDelegate { }
Fügen Sie der Erweiterung, die die
UICollectionViewDelegate
Konformität implementiert, die folgende Methode hinzu und legen Sie einen Wert für festpageWidth
:Fügen Sie der Erweiterung, die die
UICollectionViewDelegate
Konformität implementiert , die folgende Methode hinzu , legen Sie denselben Wert für festpageWidth
(Sie können diesen Wert auch an einer zentralen Stelle speichern) und legen Sie einen Wert für festcollectionViewItemCount
:quelle
Pop back (against velocity)
Teil so ändern , dass es :collectionViewLayout.collectionView!.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true)
. Beachten Sie die.centeredHorizontally
.left
war fein.left
das nicht wie erwartet funktionierte. Es schien die Zelle zu weit zurück zu schieben @fredpiSwift 3-Version von Evyas Antwort:
quelle
if(velocity.x > 1) { mod = 0.5; } else if(velocity.x < -1) { mod = -0.5; }
dann füge+ mod
nach dem+ Double(0.5)
Hier ist der einfachste Weg, den ich in Swift 4.2 für horinzontale Schriftrollen gefunden habe:
Ich verwende die erste Zelle
visibleCells
und scrolle zu dann. Wenn die erste sichtbare Zelle weniger als die Hälfte ihrer Breite zeigt, scrolle ich zur nächsten.Wenn Ihre Sammlung vertikal scrollt , ändern Sie sie einfach
x
nachy
undwidth
nachheight
quelle
Teilweise basierend auf StevenOjos Antwort. Ich habe dies mit einem horizontalen Bildlauf und ohne Bounce UICollectionView getestet. cellSize hat die CollectionViewCell-Größe. Sie können den Faktor anpassen, um die Bildlaufempfindlichkeit zu ändern.
quelle
Hier ist meine Implementierung in Swift 5 für vertikales zellbasiertes Paging:
Einige Notizen:
itemSize
Größe tatsächlich mit der Größe des Elements übereinstimmt, da dies häufig ein Problem darstellt, insbesondere bei VerwendungcollectionView(_:layout:sizeForItemAt:)
. Verwenden Sie stattdessen eine benutzerdefinierte Variable mit itemSize.self.collectionView.decelerationRate = UIScrollView.DecelerationRate.fast
.Hier ist eine horizontale Version (habe sie nicht gründlich getestet, bitte verzeihen Sie Fehler):
Dieser Code basiert auf dem Code, den ich in meinem persönlichen Projekt verwende. Sie können ihn hier überprüfen, indem Sie ihn herunterladen und das Beispielziel ausführen .
quelle
.fast
anstelle vonUIScollViewDecelerationRateFast
Ansatz 1: Sammlungsansicht
flowLayout
istUICollectionViewFlowLayout
EigentumAnsatz 2: Page View Controller
Sie können verwenden,
UIPageViewController
wenn es Ihren Anforderungen entspricht. Jede Seite verfügt über einen separaten Ansichts-Controller.quelle
Dies ist ein direkter Weg, dies zu tun.
Der Fall ist einfach, aber schließlich recht häufig (typischer Miniaturbild-Scroller mit fester Zellengröße und festem Abstand zwischen den Zellen).
Beachten Sie, dass es keinen Grund gibt, ein scrollToOffset aufzurufen oder in Layouts einzutauchen. Das native Bildlaufverhalten macht bereits alles.
Prost alle :)
quelle
collectionView.decelerationRate = .fast
, dass das Standard-Paging näher beieinander liegt.Ein bisschen wie Evyas Antwort, aber etwas flüssiger, weil das targetContentOffset nicht auf Null gesetzt wird.
quelle
Swift 5
Ich habe einen Weg gefunden, dies zu tun, ohne UICollectionView zu unterklassifizieren, sondern nur das contentOffset horizontal zu berechnen. Offensichtlich ohne isPagingEnabled auf true gesetzt. Hier ist der Code:
quelle
Hier ist meine Version davon in Swift 3. Berechnen Sie den Versatz nach dem Ende des Bildlaufs und passen Sie den Versatz mit Animation an.
collectionLayout
ist einUICollectionViewFlowLayout()
quelle
Sie können auch eine gefälschte Bildlaufansicht erstellen, um das Scrollen zu handhaben.
Horizontal oder vertikal
quelle
Ändern Sie die Romulo BM-Antwort für das Velocity-Listening
quelle
Ok, die vorgeschlagenen Antworten haben bei mir nicht funktioniert, da ich stattdessen nach Abschnitten scrollen wollte und daher Seitengrößen mit variabler Breite habe
Ich habe das gemacht (nur vertikal):
In diesem Fall berechne ich jede Seitengröße im Voraus anhand der Abschnittshöhe + Kopf- und Fußzeile und speichere sie im Array. Das ist das
pagesSizes
Mitgliedquelle
Dies ist meine Lösung in Swift 4.2. Ich wünschte, sie könnte Ihnen helfen.
quelle
quelle
Hier ist meine Vorgehensweise, indem ich a verwende,
UICollectionViewFlowLayout
um Folgendes zu überschreibentargetContentOffset
:(Obwohl ich dies letztendlich nicht benutze und stattdessen UIPageViewController verwende.)
quelle
Sie können die folgende Bibliothek verwenden: https://github.com/ink-spot/UPCarouselFlowLayout
Es ist sehr einfach und Sie müssen nicht über Details nachdenken, wie sie andere Antworten enthalten.
quelle
i erstellt ein benutzerdefinierte Sammlung Ansicht Layout hier , dass die Träger:
es ist so einfach wie:
Sie können Ihrem Projekt einfach PagingCollectionViewLayout.swift hinzufügen
oder
fügen Sie
pod 'PagingCollectionViewLayout'
zu Ihrem podfilequelle