Ich habe eine UICollectionView
mit einerUICollectionViewFlowLayout
und möchte dessen Inhaltsgröße berechnen (für die Rückgabe, intrinsicContentSize
die zum Anpassen der Höhe über AutoLayout erforderlich ist).
Das Problem ist: Selbst wenn ich eine feste und gleiche Höhe für alle Zellen habe, weiß ich nicht, wie viele "Zeilen" / Zeilen ich in der habe UICollectionView
. Ich kann diese Anzahl auch nicht anhand der Anzahl der Elemente in meiner Datenquelle bestimmen, da die Zellen, die die Datenelemente darstellen, unterschiedlich breit sind und folglich auch die Anzahl der Elemente in einer Zeile der UICollectionView
.
Da ich in der offiziellen Dokumentation keine Hinweise zu diesem Thema finden konnte und das Googeln mich nicht weiter brachte, wären Hilfe und Ideen sehr willkommen.
quelle
Wenn Sie das automatische Layout verwenden , können Sie eine Unterklasse von erstellen
UICollectionView
Wenn Sie den folgenden Code verwenden, müssen Sie keine Höhenbeschränkungen für die Sammlungsansicht angeben, da diese je nach Inhalt der Sammlungsansicht variieren würden.
Im Folgenden ist die Implementierung angegeben:
quelle
An
viewDidAppear
können Sie es bekommen durch:Wenn Sie Daten neu laden und dann eine neue Höhe mit neuen Daten berechnen müssen, können Sie diese möglicherweise erhalten, indem Sie: Beobachter hinzufügen, um zu hören, wann Ihre
CollectionView
Daten neu geladen wurdenviewdidload
:Fügen Sie dann die folgende Funktion hinzu, um eine neue Höhe zu erhalten, oder führen Sie nach dem erneuten Laden der Sammlungsansicht eine Aktion aus:
Und vergessen Sie nicht, den Beobachter zu entfernen:
quelle
user1046037 Antwort in Swift ...
quelle
UILabel
oben haben, der Inhalt voncollectionView
über ein anderes Element oben geht, haben Sie eine andere Lösung?Swift 3-Code für die Antwort von user1046037
quelle
Swift 4
quelle
Swift 4.2
quelle
Es ist zu spät, um diese Frage zu beantworten, aber ich habe dieses Problem kürzlich durchgearbeitet.
Die obige Antwort von @ lee hilft mir sehr, meine Antwort zu bekommen. Aber diese Antwort beschränkt sich auf Ziel-c und ich habe schnell gearbeitet .
@lee Erlauben Sie mir unter Bezugnahme auf Ihre Antwort, den schnellen Benutzer dieses Problem leicht lösen zu lassen. Befolgen Sie dazu bitte die folgenden Schritte:
Deklarieren Sie eine
CGFloat
Variable im Deklarationsabschnitt:An
viewDidAppear
können Sie es bekommen durch:Wenn Ihre
reload
Daten dann eine neue Höhe mit neuen Daten berechnen müssen, können Sie diese möglicherweise abrufen, indem Sie FolgendesaddObserver
abhören: Wenn IhreCollectionView
Daten nach dem erneuten Laden fertig sindviewWillAppear
:Fügen Sie dann die folgende Funktion hinzu, um eine neue Höhe zu erhalten, oder führen Sie nach dem erneuten
collectionview
Laden etwas aus:Und vergessen Sie nicht, den Beobachter zu entfernen:
Ich hoffe, dies wird Ihnen helfen, Ihr Problem schnell zu lösen.
quelle
Diese Antwort basiert auf @Er. Vihars Antwort. Sie können die Lösung einfach mit RxSwift implementieren
quelle
Schnelle Version von @ user1046037:
quelle
Swift 4.2, Xcode 10.1, iOS 12.1:
Aus irgendeinem Grund
collectionView.contentSize.height
erschien es kleiner als die aufgelöste Höhe meiner Sammlungsansicht. Zuerst habe ich eine automatische Layoutbeschränkung in Bezug auf die Hälfte der Höhe der Übersicht verwendet. Um dies zu beheben, habe ich die Einschränkung so geändert, dass sie relativ zum "sicheren Bereich" der Ansicht ist.Dadurch konnte ich die Zellenhöhe so einstellen, dass meine Sammlungsansicht mit
collectionView.contentSize.height
folgenden Elementen gefüllt wurde :Vor
Nach dem
quelle
Unter der Annahme, dass Ihre collectionView als collectionView bezeichnet wird , können Sie die Höhe wie folgt annehmen.
quelle
Außerdem , rufen Sie besser an,
reloadData
bevor Sie die Höhe ermitteln:quelle