Ich habe einige Nachforschungen angestellt, aber ich konnte kein Codebeispiel zum horizontalen Zentrieren von Zellen in einer UICollectionView finden.
Anstatt dass die erste Zelle wie diese X00 ist , möchte ich, dass sie wie diese 0X0 ist . Gibt es eine Möglichkeit, dies zu erreichen?
BEARBEITEN:
um zu visualisieren, was ich will:
Ich brauche es, um wie Version B auszusehen, wenn es nur ein Element in der CollectionView gibt. Wenn ich mehr als ein Element habe, sollte es wie Version A sein, aber mit mehr Elementen.
Im Moment sieht es aus wie Version A, wenn ich nur 1 Element habe, und ich frage mich, wie ich es so aussehen lassen kann wie B.
Danke für die Hilfe!
Antworten:
Es ist keine gute Idee, eine Bibliothek zu verwenden, wenn Ihr Zweck nur darin besteht, die Ausrichtung zu zentrieren.
Besser können Sie diese einfache Berechnung in Ihrer collectionViewLayout-Funktion durchführen.
quelle
collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int)
.leftInset
let leftInset = max(0.0, (self.collectionView.bounds.width - CGFloat(totalCellWidth + totalSpacingWidth)) / 2)
Swift 5.1
Swift 4.2
Swift 3
Vergessen Sie nicht, das Protokoll hinzuzufügen
quelle
Versuchen Sie dies für Swift 4
Fügen Sie stattdessen Ihre cellWidth 165.0 hinzu
quelle
Ich benutze dafür KTCenterFlowLayout und es funktioniert großartig. Es ist eine benutzerdefinierte Unterklasse
UICollectionViewFlowLayout
, die Zellen nach Ihren Wünschen zentriert. (Hinweis: Dies ist keine triviale Sache, die durch das Posten von Code gelöst werden muss. Deshalb verlinke ich auf ein GitHub-Projekt!)quelle
Eine objektive C-Version von Darshan Patels Antwort :
quelle
Die Antwort von @Safad Funy leicht modifiziert, hat in der neuesten Version von Swift & iOS für mich funktioniert. In diesem Fall wollte ich, dass die Breite der Zellen ein Drittel der Größe der Sammlungsansicht beträgt.
quelle
Sie können diese Erweiterung verwenden (Swift 4).
Es kann Zellen mit zentrieren, wenn Sie
collectionView
habenlayout.estimatedItemSize = UICollectionViewFlowLayoutAutomaticSize
.Es funktioniert mit jeder Zellengröße und funktioniert perfekt, wenn
scrollDirection = .horizontal
Hoffe es hilft dir!
quelle
Swift 4.2 (horizontal und vertikal). Es ist ein kleines Upgrade des Pink Panther-Codes und ein großes Dankeschön an ihn!
Stellen Sie sicher, dass Ihre Klasse dem UICollectionViewDelegateFlowLayout- Protokoll entspricht
quelle
Hier ist die neuere Version für Swift 5, die auch funktioniert, wenn die Zellen mehr als eine Zeile umfassen:
Bitte stellen Sie sicher, dass Ihre Klasse dem Protokoll entspricht
UICollectionViewDelegateFlowLayout
.quelle
Swift 4
quelle
Für die Personen, die nur eine Polsterung hinzufügen möchten ( oben, links, unten, rechts ):
Fügen Sie das Protokoll hinzu
UICollectionViewDelegateFlowLayout
Dieses Beispiel zeigt eine Polsterung links und rechts mit 40.
quelle
SWIFT 4.2
// //
quelle
Sie können meine Lösung ausprobieren, es funktioniert gut,
quelle
Die akzeptierte Antwort ist die richtige Antwort, aber wenn Sie
totalCellWidth
kleiner als die istCollectionView
,width
können Sie wie folgt vorgehen , um sich dagegen zu schützen.quelle
Dieser Code sollte die Sammlungsansicht auch in Swift 4.0 ohne Änderung horizontal zentrieren:
Stellen Sie sicher, dass Ihre Klasse dem
UICollectionViewDelegateFlowLayout
Protokoll entsprichtquelle
Am Ende habe ich hier einen völlig anderen Ansatz gewählt, der meiner Meinung nach erwähnenswert ist.
Ich habe eine Einschränkung für meine Sammlungsansicht festgelegt, die horizontal in der Mitte ausgerichtet ist. Dann habe ich eine weitere Einschränkung festgelegt, die die Breite angibt. Ich habe in meinem viewController einen Ausgang für die Breitenbeschränkung erstellt, der die Sammlungsansicht enthält. Wenn dann meine Datenquelle geändert wird und ich die Sammlungsansicht aktualisiere, nehme ich die Anzahl der Zellen und führe eine (sehr ähnliche) Berechnung durch, um die Breite zurückzusetzen.
let newWidth = (items.count * cellWidth) + (items.count * cellSpacing)
Dann setze ich den
.constant
Wert des Constraint Outlets auf das Berechnungsergebnis und Autolayout erledigt den Rest.Dies kann zu Konflikten mit dem UICollectionViewDelegateFlowLayout führen, aber dies hat perfekt funktioniert, um eine linksbündige Sammlungsansicht zu erstellen. Ohne einen Delegierten scheint es nur zu funktionieren, wenn die Zellen den größten Teil der Ansicht ausfüllen.
quelle
Allgemeine Lösung für das Flowlayout, bei dem die Seiten zentriert werden, wenn sie kleiner als die Breite sind, und links ausgerichtet werden, wenn mehr vorhanden sind
Schnelle Version (konvertiert von ObjC)
quelle
Ich habe eine ähnliche Situation im Projekt und habe sie durch Bezugnahme behoben
UPCarouselFlowLayout
Ich denke, es unterstützt die
swift 5
Versionhttps://github.com/ink-spot/UPCarouselFlowLayout/blob/master/UPCarouselFlowLayout/UPCarouselFlowLayout.swift
Schauen Sie sich die Code-Implementierung in an
quelle
Am einfachsten ist es, die geschätzte Größe der Sammlungsansicht im Storyboard oder mit Code auf Keine zu setzen
layout.estimatedItemSize = CGSize.zero
quelle
Wenn nur Platz für eine Zelle pro Gruppe vorhanden ist, zentriert ein
leading:
undtrailing:
von.flexible(0)
die Zelle horizontal:quelle
Ich habe diesen Code in einem Projekt verwendet. Es zentriert die collectionView horizontal und vertikal in beide Richtungen
.horizontal
und unter.vertical
Verwendung der Einfügungen des Abschnitts. Respektiert den Abstand und den ursprünglichen Einschub des Abschnitts, falls festgelegt. Code, der im Delegaten verwendet werden soll,UICollectionViewDelegateFlowLayout
damit wir Zugriff auf alle Eigenschaften haben, die wirUIcollectionView
zur Wiederverwendbarkeit aus dem Storyboard abrufen oder im Storyboard festlegen müssen.Hoffe, es würde jemandem helfen - es zentriert den Abschnitt, nicht die Elemente innerhalb des Abschnitts, für mehr müssen wir das
UICollectionViewFlowLayout
oderUICollectionViewLayout
als Mosaikbeispiel von Apple unterordnen.quelle
Ich denke, Sie müssen die Zelle zentrieren, also wird UITableView anstelle von collectionView von großem Nutzen sein. Verwenden Sie einfach einen UIViewController und platzieren Sie zwei UIViews vorne und hinten und platzieren Sie eine
UITableView
mittlere Hoffnung. Dies hilftquelle