Mam UICollectionView
z ikoną UICollectionViewFlowLayout
i chcę obliczyć rozmiar jego zawartości (do zwrotu intrinsicContentSize
potrzebnego do dostosowania jego wysokości za pomocą AutoLayout).
Problem polega na tym, że nawet jeśli mam stałą i równą wysokość dla wszystkich komórek, nie wiem, ile "wierszy" / linii mam w pliku UICollectionView
. Nie mogę również określić tej liczby na podstawie liczby elementów w moim źródle danych, ponieważ komórki reprezentujące elementy danych różnią się szerokością, podobnie jak liczba elementów, które mam w jednym wierszu pliku UICollectionView
.
Ponieważ nie mogłem znaleźć żadnych wskazówek na ten temat w oficjalnej dokumentacji, a googlowanie nie przyniosło mi nic więcej, każda pomoc i pomysły byłyby bardzo mile widziane.
źródło
W przypadku korzystania z układu automatycznego można utworzyć podklasę
UICollectionView
Jeśli użyjesz poniższego kodu, nie musisz określać żadnych ograniczeń wysokości dla widoku kolekcji, ponieważ będzie się on różnić w zależności od zawartości widoku kolekcji.
Poniżej podano wykonanie:
źródło
Co
viewDidAppear
można je dostać przez:Może kiedy przeładujesz dane, a następnie będziesz musiał obliczyć nową wysokość z nowymi danymi, możesz to uzyskać przez: dodaj obserwatora, aby nasłuchiwał, kiedy
CollectionView
zakończysz przeładowywanie danych oviewdidload
:Następnie dodaj poniżej funkcję, aby uzyskać nową wysokość lub zrób cokolwiek po zakończeniu ponownego ładowania widoku kolekcji:
I nie zapomnij usunąć obserwatora:
źródło
user1046037 odpowiedź w Swift ...
źródło
UILabel
powyższego, treść zcollectionView
przejścia nad innym elementem powyżej, czy masz inne rozwiązanie?Kod Swift 3 dla odpowiedzi użytkownika 1046037
źródło
Szybki 4
źródło
Swift 4.2
źródło
Jest za późno, aby odpowiedzieć na to pytanie, ale ostatnio omawiałem ten problem. Powyższa odpowiedź
@ lee bardzo mi pomogła w uzyskaniu odpowiedzi. Ale ta odpowiedź ogranicza się do celu-c i pracowałem szybko . @lee W nawiązaniu do Twojej odpowiedzi, pozwól mi pozwolić szybkiemu użytkownikowi na łatwe rozwiązanie tego problemu. W tym celu wykonaj poniższe czynności:
Zadeklaruj
CGFloat
zmienną w sekcji deklaracji:Co
viewDidAppear
można je dostać przez:Może kiedy
reload
dane będą musiały obliczyć nową wysokość przy użyciu nowych danych, można to uzyskać w następujący sposób:addObserver
aby nasłuchiwać, kiedyCollectionView
zakończyliśmy ponowne ładowanie danych oviewWillAppear
:Następnie dodaj poniżej funkcję, aby uzyskać nową wysokość lub zrób cokolwiek po
collectionview
zakończeniu przeładowania:I nie zapomnij usunąć obserwatora:
Mam nadzieję, że pomoże to w szybkim rozwiązaniu problemu.
źródło
Ta odpowiedź jest oparta na @Er. Odpowiedź Vihara. Możesz łatwo wdrożyć rozwiązanie za pomocą RxSwift
źródło
Szybka wersja @ user1046037:
źródło
Swift 4.2, Xcode 10.1, iOS 12.1:
Z jakiegoś powodu
collectionView.contentSize.height
wydawał się mniejszy niż ustalona wysokość widoku mojej kolekcji. Po pierwsze, użyłem ograniczenia automatycznego układu w stosunku do 1/2 wysokości nadzoru. Aby to naprawić, zmieniłem ograniczenie na „bezpieczny obszar” widoku.Pozwoliło mi to ustawić wysokość komórki w celu wypełnienia widoku kolekcji za pomocą
collectionView.contentSize.height
:Przed
Po
źródło
zakładając, że collectionView ma nazwę collectionView , możesz przyjąć wysokość w następujący sposób.
źródło
Ponadto , lepiej zadzwoń
reloadData
przed uzyskaniem wzrostu:źródło