Ich verwende derzeit UICollectionView
für das Benutzeroberflächenraster, und es funktioniert gut. Ich möchte jedoch das horizontale Scrollen aktivieren. Das Raster unterstützt 8 Elemente pro Seite. Wenn die Gesamtzahl der Elemente beispielsweise 4 beträgt, sollten die Elemente so angeordnet werden, dass die horizontale Bildlaufrichtung aktiviert ist:
0 0 x x
0 0 x x
Hier 0 -> Sammlungsgegenstand und x -> Leere Zellen
Gibt es eine Möglichkeit, sie zentriert auszurichten wie:
x 0 0 x
x 0 0 x
Damit der Inhalt sauberer aussieht?
Auch die folgende Anordnung könnte auch eine Lösung sein, die ich erwarte.
0 0 0 0
x x x x
minimumInteritemSpacing
nur deren Minimum angegeben wird.return UIEdgeInsetsMake(0, 100, 0, 100);
. Wenn zusätzlicher Speicherplatz vorhanden ist, erweitert die Sammlungsansicht den Zwischenabstand. Stellen Sie daher sicher, dass LeftInset + CellWidth * Ncells + CellSpacing * (Ncells-1) + RightInset = CollectionViewWidthFür diejenigen, die nach einer Lösung für mittig ausgerichtete Sammlungsansichtszellen mit dynamischer Breite suchen , habe ich letztendlich Angels Antwort für eine links ausgerichtete Version geändert , um eine mittig ausgerichtete Unterklasse für zu erstellen
UICollectionViewFlowLayout
.CenterAlignedCollectionViewFlowLayout
quelle
guard let superArray = super.layoutAttributesForElementsInRect(rect) else { return nil } guard let attributes = NSArray(array: superArray, copyItems: true) as? [UICollectionViewLayoutAttributes] else { return nil }
interItemSpacing
die StandardeinstellungminimumInteritemSpacing
.Die Top-Lösungen hier haben bei mir nicht sofort funktioniert, daher habe ich mir diese ausgedacht, die für jede horizontale Bildlaufsammlungsansicht mit Ablauflayout und nur einem Abschnitt funktionieren sollte:
quelle
Es ist einfach, Einfügungen dynamisch zu berechnen. Dieser Code zentriert immer Ihre Zellen:
quelle
Ähnlich wie bei anderen Antworten ist dies eine dynamische Antwort, die für Zellen mit statischer Größe funktionieren sollte. Die einzige Änderung, die ich vorgenommen habe, ist, dass ich die Polsterung auf beiden Seiten anbringe. Wenn ich das nicht tat, hatte ich Probleme.
Ziel c
Schnell
Wenn weiterhin Probleme auftreten, stellen Sie sicher, dass Sie sowohl den
minimumInteritemSpacing
alsminimumLineSpacing
auch den gleichen Wert festlegen, da diese Werte miteinander in Beziehung zu stehen scheinen.quelle
Fügen Sie dies in Ihren Delegierten für die Sammlungsansicht ein. Es berücksichtigt mehr der grundlegenden Einstellungen für das Ablauflayout als die anderen Antworten und ist daher allgemeiner.
schnelle Version (danke g0ld2k):
quelle
totalCellWidth
sollte seincellWidth*cellCount + spacing*(cellCount-1)
.Meine Lösung für statisch große Sammlungsansichtszellen, die links und rechts aufgefüllt werden müssen.
quelle
Ich habe eine Tag-Leiste in meiner App, die ein
UICollectionView
& verwendetUICollectionViewFlowLayout
, wobei eine Reihe von Zellen mittig ausgerichtet ist.Um den richtigen Einzug zu erhalten, subtrahieren Sie die Gesamtbreite aller Zellen (einschließlich des Abstands) von der Breite Ihrer
UICollectionView
und dividieren durch zwei.Das Problem ist diese Funktion -
- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section;
wird vorher aufgerufen ...
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath;
... Sie können also nicht über Ihre Zellen iterieren, um die Gesamtbreite zu bestimmen.
Stattdessen müssen Sie die Breite jeder Zelle erneut berechnen. In meinem Fall verwende ich sie,
[NSString sizeWithFont: ... ]
da meine Zellenbreiten vom UILabel selbst bestimmt werden.quelle
interSpacing
?interSpacing
ist nur eine Konstante in meinem Code, die den Raum bestimmt, den ich zwischen UICollectionViewCellsIn Swift werden die Zellen im Folgenden gleichmäßig verteilt, indem die Seiten jeder Zelle mit der richtigen Polsterung versehen werden. Natürlich müssen Sie zuerst Ihre Zellenbreite kennen / einstellen.
quelle
Swift 2.0 funktioniert gut für mich!
Wobei: screenWight : im Grunde genommen die Breite meiner Sammlung (volle Bildschirmbreite) - Ich habe Konstanten erstellt: let screenWight: CGFloat = UIScreen.mainScreen (). Bounds.width, da self.view.bounds jedes Mal 600 - coz SizeClasses- Elemente anzeigt - Array von Zellen 50 - meine manuelle Zellenbreite 10 - mein Abstand zwischen Zellen
quelle
Sie können https://github.com/keighl/KTCenterFlowLayout folgendermaßen verwenden :
quelle
Sie sind sich nicht sicher, ob dies in Xcode 5 neu ist oder nicht, aber Sie können jetzt den Größeninspektor über Interface Builder öffnen und dort einen Einschub festlegen. Dies verhindert, dass Sie benutzerdefinierten Code schreiben müssen, um dies für Sie zu tun, und sollte die Geschwindigkeit, mit der Sie die richtigen Offsets finden, drastisch erhöhen.
quelle
Eine andere Möglichkeit, dies zu tun, besteht darin
collectionView.center.x
, Folgendes einzustellen:In diesem Fall nur den richtigen Einschub respektieren, der für mich funktioniert.
quelle
Basierend auf der Antwort von user3676011 kann ich eine detailliertere mit kleiner Korrektur vorschlagen. Diese Lösung funktioniert hervorragend mit Swift 2.0 .
Es gab ein Problem in
wo sollte zusätzlich
-1
erwähnt werden.quelle
Auf diese Weise erhielt ich eine Sammlungsansicht, deren Mitte mit einem festen Zwischenabstand ausgerichtet war
quelle
Arbeitsversion der Antwort auf Ziel C von kgaidis mit Swift 3.0:
quelle
Hier ist meine Lösung mit einigen Annahmen:
Sie können sich jederzeit an Ihre Bedürfnisse anpassen.
Zentriertes Layout mit variabler Zellenbreite:
Ergebnis:
quelle
Hier ist, wie Sie es tun können und es funktioniert gut
quelle