Das macht mich verrückt! Ich habe einen UICollectionViewController wie unten gezeigt:
class PhrasesCompactCollectionViewController: UICollectionViewController
Die Anzahl der Abschnitte und cellForItemAt werden aufgerufen, aber der sizeForItemAtIndexPath wird niemals aufgerufen. Ich verwende den gleichen exakten Code woanders und er wird korrekt ausgelöst. Ich benutze Xcode 8 Beta 6.
func collectionView(collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
return CGSize(width: 120, height:120)
}
In Swift 3+ Verwenden Sie diese Methode:
Stellen Sie sicher, dass Ihre Klasse beiden Delegierten entspricht
UICollectionViewDelegate
UICollectionViewDelegateFlowLayout
quelle
UICollectionViewDelegate
wie dies UICollectionViewController bereits tut.Ich hatte das gleiche Problem. Das einzige, was mir geholfen hat, war, die 'Geschätzte Größe' für die Zellengröße unter dem Sammlungsgrößeninspektor 'Keine' zu erstellen.
quelle
sizeForItemAt
nicht erwähnt. Sehr hilfreich.sizeForItemAt
funktionierte gut bis Xcode 11.4, als die Zellen plötzlich eine falsche Breite hatten. Versuchte ein paar Dinge und das hat endlich funktioniert.Swift 3
Um die Zellengröße von UICollectionView festzulegen, müssen Sie ein Objekt von erstellen und anpassen
UICollectionViewFlowLayout
. Passen Sie die Eigenschaften an und setzen Sie das Layoutobjekt auf das UICollectionView-Objekt.Ändern Sie die Objekte cellheight und cell cellWidth entsprechend Ihren Anforderungen (die gewünschte Zellenhöhe und -breite).
Stellen Sie sicher: Wenn Sie die Methode sizeForItemAt indexPath hinzugefügt haben, müssen Sie die Methode ENTFERNEN ...
quelle
Swift 5
Alle diese Schritte sind erforderlich :
UICollectionViewDelegate, UICollectionViewDataSource
collectionView.delegate = self
und festcollectionView.dataSource = self
wie :
quelle
Die erste Klasse muss UICollectionViewDelegateFlowLayout bestätigen. Dann müssen Sie folgenden Code in viewDidLoad () schreiben:
// Um die UICollectionView anzuweisen, die UICollectionViewDelegateFlowLayout-Methoden Ihres UIViewControllers zu verwenden
// Wenn Sie Ihr eigenes Ablauflayout für die Sammlungsansicht festlegen möchten
Mit diesem Code UICollectionViewDelegateFlowLayout-Methode
wird aufgerufen, können Sie die Größe in dieser Methode einstellen.
quelle
Drei Dinge, die Sie überprüfen müssen, wenn keine Antwort funktioniert:
Implementieren Sie den FlowLayout-Delegaten:
class MyController: UICollectionViewController, UICollectionViewDelegateFlowLayout
Verwenden Sie die Methode für die Größe des Artikels für Swift 3.0+:
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { return CGSize(width: (collectionView.frame.width / 3) - 1, height: collectionView.frame.width) }
Wählen Sie
Estimate size = None
im Inspect-Element von UICollectionView.quelle
Ich hatte das gleiche Problem und nichts würde es beheben. Ich hatte eine gelbe Warnung mit der Aufschrift, es privat zu machen, weil es einer anderen vom Layout-Delegierten definierten Funktion nahe kam. Was es für mich behoben hat war:
Beachten Sie den Unterschied zwischen "sizeForItemAtIndexPath" und der richtigen "sizeForItemAt".
Ich riss mir tagelang die Haare aus, um das herauszufinden, und es funktionierte schließlich. Im Folgenden werde ich alle meine Funktionen einschließen, um Ihnen zu zeigen, wie ich auch eine Zelle "versteckt" habe, indem ich die Höhe gleich 0 gemacht habe.
quelle
Ich hatte dieses Problem letzte Nacht. Endlich um Mitternacht gelöst, als mir klar wurde, dass die Methode 'didSelectItemAtIndex' nicht mit einer Verschlussklammer "}" abgeschlossen wurde.
Ich habe eine Abschlussklammer ganz unten in der Klasse hinzugefügt, als ich nach dem Kompilierungsfehler gefragt wurde. Tatsächlich befanden sich alle Methoden unter 'didSelectItemAtIndex' in dieser Methode.
Hier posten, nur für den Fall, dass jemand anderes 4 Stunden seines Abends damit verschwendet :-(
quelle
Stellen Sie sicher, dass Sie dies in viewDidLoad () einfügen.
quelle
Mein Problem war, dass ich mein UICollectionViewDataSource-Objekt als lokale Variable erstellen ließ. Wenn Sie Ihr dataSource-Objekt also manuell im Code initialisieren, müssen Sie es als globale Variable speichern.
quelle
Verwenden Sie diese Methode
Anstatt
quelle
Für mich (in Swift 3.1) muss die Methode wie folgt als öffentlich deklariert werden:
Vergiss nicht, es öffentlich zu machen .
quelle
public
Mit diesem Code können Sie Ihren Code zwischen Frameworks und Modulen zugänglich machen.