Eu tenho um UICollectionView
com um UICollectionViewFlowLayout
e quero calcular seu tamanho de conteúdo (para retorno é intrinsicContentSize
necessário ajustar sua altura via AutoLayout).
O problema é: Mesmo que eu tenha uma altura fixa e igual para todas as células, não sei quantas "linhas" / linhas tenho no UICollectionView
. Também não posso determinar essa contagem pelo número de itens em minha fonte de dados, uma vez que as células que representam os itens de dados variam em largura, o mesmo acontece com o número de itens que tenho em uma linha do UICollectionView
.
Como não consegui encontrar nenhuma dica sobre este tópico na documentação oficial e o Google não me trouxe mais nada, qualquer ajuda e ideias seriam muito apreciadas.
fonte
Caso você esteja usando o layout automático , você pode criar uma subclasse de
UICollectionView
Se você usar o código abaixo, não será necessário especificar nenhuma restrição de altura para a visualização da coleção, pois ela varia com base no conteúdo da visualização da coleção.
A seguir está a implementação:
fonte
Em
viewDidAppear
você pode obtê-lo por:Talvez quando você recarregar dados e precisar calcular uma nova altura com novos dados, você pode obtê-lo: adicione o observador para ouvir quando seus
CollectionView
dados de recarga terminarem emviewdidload
:Em seguida, adicione a função abaixo para obter uma nova altura ou faça qualquer coisa após a coleção de visualização terminar de recarregar:
E não se esqueça de remover o observador:
fonte
user1046037 responder em Swift ...
fonte
UILabel
acima, o conteúdocollectionView
passa por cima de outro elemento acima, você tem outra solução?Código Swift 3 para a resposta do usuário 1046037
fonte
Swift 4
fonte
Swift 4.2
fonte
É tarde demais para responder a essa pergunta, mas recentemente resolvi esse problema.
A resposta de @ Lee acima me ajudou muito a obter minha resposta. Mas essa resposta é limitada ao objetivo-c e eu estava trabalhando rapidamente .
@lee Com referência à sua resposta, permita-me deixar o rápido usuário resolver esse problema facilmente. Para isso, siga os passos abaixo:
Declare uma
CGFloat
variável na seção de declaração:Em
viewDidAppear
você pode obtê-lo por:Talvez quando seus
reload
dados precisarem calcular uma nova altura com novos dados, você pode obtê-los:addObserver
para ouvir quando seusCollectionView
dados de recarregamento terminados emviewWillAppear
:Em seguida, adicione a função abaixo para obter uma nova altura ou faça qualquer coisa após
collectionview
terminar a recarga:E não se esqueça de remover o observador:
Espero que isso ajude você a resolver seu problema rapidamente.
fonte
Esta resposta é baseada em @Er. A resposta de Vihar. Você pode facilmente implementar a solução usando RxSwift
fonte
Versão Swift de @ user1046037:
fonte
Swift 4.2, Xcode 10.1, iOS 12.1:
Por algum motivo,
collectionView.contentSize.height
estava parecendo menor do que a altura resolvida da visualização da minha coleção. Primeiro, eu estava usando uma restrição de layout automático relativa a 1/2 da altura do superview. Para corrigir isso, alterei a restrição para ser relativa à "área segura" da visualização.Isso me permitiu definir a altura da célula para preencher a visualização da minha coleção usando
collectionView.contentSize.height
:Antes
Depois de
fonte
presumindo que sua collectionView seja nomeada como collectionView, você pode obter a altura da seguinte maneira.
fonte
Além disso, é melhor você ligar
reloadData
antes de obter a altura:fonte