Ich habe gerade angefangen, etwas über UICollectionViews zu lernen. Ich frage mich, ob jemand weiß, wie man die Anzahl der Spalten in einer Sammlungsansicht angibt. Der Standardwert ist 3 (iPhone / Porträt). Ich habe mir die Dokumentation angesehen und kann anscheinend keine präzise Antwort finden.
100
UICollectionView
grundsätzlich als Raster verwende, weil ich weiß, dass ich nur 4 Spalten möchte. Dazu mache ich meine Zellen auf eine bestimmte Größe und den Abstand zwischen ihnen auf eine bestimmte Größe, sodass in der Sammlungsansicht nur 4 Spalten angezeigt werden, unabhängig von der Ausrichtung. Ist das ähnlich wie das, was Sie brauchen?Antworten:
CollectionViews sind sehr leistungsfähig und haben ihren Preis. Viele, viele Möglichkeiten. Wie omz sagte:
Ich würde vorschlagen, das
<UICollectionViewDelegateFlowLayout>
Protokoll zu implementieren und Ihnen Zugriff auf die folgenden Methoden zu gewähren, mit denen Sie das Layout Ihres Protokolls besser steuern könnenUICollectionView
, ohne es in Unterklassen unterteilen zu müssen:collectionView:layout:insetForSectionAtIndex:
collectionView:layout:minimumInteritemSpacingForSectionAtIndex:
collectionView:layout:minimumLineSpacingForSectionAtIndex:
collectionView:layout:referenceSizeForFooterInSection:
collectionView:layout:referenceSizeForHeaderInSection:
collectionView:layout:sizeForItemAtIndexPath:
Durch die Implementierung der folgenden Methode wird Ihr UICollectionView außerdem gezwungen, sein Layout bei einer Orientierungsänderung zu aktualisieren: (Angenommen, Sie möchten die Größe der Zellen für die Querformatgröße ändern und sie strecken.)
Zusätzlich sind hier 2 wirklich gute Tutorials zu
UICollectionViews
:http://www.raywenderlich.com/22324/beginning-uicollectionview-in-ios-6-part-12
http://skeuo.com/uicollectionview-custom-layout-tutorial
quelle
collectionView:layout:sizeForItemAtIndexPath:
für alle Geräte separat gehandhabt werden?new GridLayoutManager(mContext, 4))
(4 Spalten), sehr einfach oder einfach verwendenLinearLayoutManager
(es hat natürlich nur 1 Spalte)Mit Swift 5 und iOS 12.3 können Sie eine der folgenden 4 Implementierungen verwenden, um die Anzahl der Elemente pro Zeile in Ihrer zu festlegen,
UICollectionView
während Sie Einfügungen und Größenänderungen (einschließlich Rotation) verwalten.# 1. Unterklasse
UICollectionViewFlowLayout
und VerwendungUICollectionViewFlowLayout
deritemSize
Eigenschaft vonColumnFlowLayout.swift:
CollectionViewController.swift:
# 2. Mit
UICollectionViewFlowLayout
deritemSize
Methode von#3. Mit
UICollectionViewDelegateFlowLayout
dercollectionView(_:layout:sizeForItemAt:)
Methode von# 4. Unterklasse
UICollectionViewFlowLayout
und VerwendungUICollectionViewFlowLayout
derestimatedItemSize
Eigenschaft vonCollectionViewController.swift:
FlowLayout.swift:
Cell.swift:
quelle
Ich habe
UICollectionViewDelegateFlowLayout
auf meiner implementiertUICollectionViewController
und die Methode überschrieben, die für die Bestimmung der Größe der Zelle verantwortlich ist. Ich nahm dann die Bildschirmbreite und teilte sie mit meiner Spaltenanforderung. Zum Beispiel wollte ich 3 Spalten auf jeder Bildschirmgröße haben. So sieht mein Code aus:quelle
Die Antwort von noob erweitern:
Dies ermöglicht einen beliebigen Abstand zwischen den Zellen. Es wird davon ausgegangen, dass eine
Int
Elementvariable aufgerufen wirdnumberOfItemsPerRow
und dass alle Zellen quadratisch und gleich groß sind. Wie in der Antwort von jhilgert00 erwähnt, müssen wir auch auf Orientierungsänderungen reagieren, aber jetzt verwenden wirviewWillTransitionToSize
as,willRotateToInterfaceOrientation
was abgeschrieben wird.quelle
Hier ist der Arbeitscode für Swift 3 für ein zweispaltiges Layout:
Fühlen Sie sich frei, "nbCol" auf die gewünschte Anzahl von Spalten zu ändern.
quelle
Wenn Sie mit Delegate faul sind.
PS: Sollte auch nach der Rotation aufgerufen werden
quelle
Auf Swift 3 aktualisiert:
Anstelle des Ablauflayouts bevorzuge ich die Verwendung eines benutzerdefinierten Layouts für eine bestimmte Spalten- und Zeilennummer. Weil:
Normale Zelle und Header-Zelle: (Fügen Sie UILabel als IBOutlet zu Ihrer xib hinzu):
Benutzerdefiniertes Layout:
CollectionView:
Verwenden Sie CollectionView von ViewController:
Endlich können Sie ausgefallene CollectionView haben!
quelle
weil
UICollectionView
Flexibilität gibt es mehrere Möglichkeiten, die Anzahl der Spalten abhängig von der Art des verwendeten Layouts zu ändern.Das
UICollectionViewFlowLayout
(mit dem Sie wahrscheinlich arbeiten) gibt keine Anzahl von Spalten direkt an (da dies von der Größe / Ausrichtung der Ansicht abhängt). Der einfachste Weg, dies zu ändern, besteht darin, dieitemSize
Eigenschaft und / oderminimumInteritemSpacing
/ festzulegenminimumLineSpacing
.quelle
Swift 3.0. Funktioniert sowohl für horizontale als auch für vertikale Bildlaufrichtungen und für variable Abstände
Geben Sie die Anzahl der Spalten an
Konfigurieren Sie
flowLayout
das Rendern angegebennumberOfColumns
quelle
Auf Swift 5+ iOS 13 aktualisiert
Sammlungsansicht Die geschätzte Größe darf keine sein
Deklarieren Sie den Rand für die Zelle
In viewDidLoad configure
minimumInteritemSpacing
,minimumLineSpacing
,sectionInset
UICollectionViewDataSource- Methode
sizeForItemAt
quelle
Alles dreht sich um das Layout, das Sie zeichnen möchten. Sie können eine benutzerdefinierte Klasse erstellen, die von UICollectionViewFlowLayout erbt. Derzeit gibt es keine direkte Methode zum Festlegen von Spalten. Wenn Sie diese Art von Funktionalität erreichen möchten, müssen Sie dies manuell tun. Sie müssen dies in Ihrer benutzerdefinierten Flow-Layout-Klasse behandeln.
Nun stellt sich die Frage, wie Sie es machen werden. Wenn Sie den Zellenrahmen nicht stören möchten, können Sie ihn anpassen
Eine andere Möglichkeit besteht darin, Ihnen eigene Positionen von Zellen bereitzustellen. Durch Überschreiben von zwei Methoden, die während der Layouterstellung aufgerufen werden.
UICollectionViewLayoutAttributes ist eine Klasse, die sich mit Zellenposition, Frame, Zindex usw. Befasst
quelle
Diese Antwort ist für Swift 3.0 ->
zuerst dem Protokoll entsprechen:
Fügen Sie dann diese Methoden hinzu:
quelle
Ich wollte nur Imanou Petits Antwort Nr. 2 anhängen. Um sicherzustellen, dass die Ränder unabhängig von der Bildschirmbreite genau sind, verwende ich einen iterativen Löser mit einem gewünschten Rand und der Anzahl der Spalten als Eingaben. Ich habe auch eine Richtungsflagge hinzugefügt, auf der die endgültigen Ränder mit dem Ziel verglichen werden.
Der iterative Löser wird unten gezeigt und gibt cellWidth und margin zurück.
Ich nenne es so:
Ich wende dann die Werte für cellWidth und margin auf das Flow-Layout als solches an:
{func collectionView (_ collectionView: UICollectionView, Layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {return CGSize (Breite: cellWidth, Höhe: cellWidth)}
}}
Hoffe das hilft. Es gibt wahrscheinlich einen einfacheren Weg, um sicherzustellen, dass die Ränder genau sind, aber dies ist eine Methode. Außerdem wurde dieser Code nicht für Geräte getestet, die rotierende Sammlungsansichten ermöglichen.
Vielen Dank,
quelle
Die perfekte Lösung ist die Verwendung von UICollectionViewDelegateFlowLayout. Sie können jedoch problemlos die Zellenbreite berechnen und auf die gewünschte Anzahl von Spalten aufteilen
Das Schwierige ist, die Breite ohne Bruch zu machen
quelle
Ich habe ein Sammlungslayout erstellt.
Um das Trennzeichen sichtbar zu machen, setzen Sie die Hintergrundfarbe der Sammlungsansicht auf Grau. Eine Zeile pro Abschnitt.
Verwendung:
Layout:
quelle
Versuchen Sie dies, es funktioniert perfekt für mich,
Befolgen Sie die folgenden Schritte:
1. Definieren Sie Werte in der .h-Datei.
ODER
2. Code in Sammlung hinzufügen Datenquellenmethoden für Layout anzeigen wie folgt:
Hoffe, das wird jemandem helfen.
quelle
Fügen Sie zuerst UICollectionViewDelegateFlowLayout als Protokoll hinzu.
Dann:
quelle