Tengo un UICollectionView
con un UICollectionViewFlowLayout
, y quiero calcular el tamaño de su contenido (para devolverlo enintrinsicContentSize
necesario ajustar su altura a través de AutoLayout).
El problema es: incluso si tengo una altura fija e igual para todas las celdas, no sé cuántas "filas" / líneas tengo en el UICollectionView
. Tampoco puedo determinar ese recuento por la cantidad de elementos en mi fuente de datos, ya que las celdas que representan los elementos de datos varían en ancho, por lo que también lo hace la cantidad de elementos que tengo en una línea de UICollectionView
.
Dado que no pude encontrar ninguna pista sobre este tema en la documentación oficial y buscar en Google no me trajo más, cualquier ayuda e idea sería muy apreciada.
fuente
En caso de que esté utilizando el diseño automático , puede crear una subclase de
UICollectionView
Si usa el siguiente código, entonces no tiene que especificar ninguna restricción de altura para la vista de colección, ya que variaría según el contenido de la vista de colección.
A continuación se muestra la implementación:
fuente
En
viewDidAppear
puedes conseguirlo por:Tal vez cuando recargue los datos, luego necesite calcular una nueva altura con nuevos datos, entonces puede obtenerlo: agregue un observador para escuchar cuando haya
CollectionView
terminado de recargar los datos enviewdidload
:Luego agregue la función de abajo para obtener una nueva altura o hacer cualquier cosa después de que la vista de colección haya terminado de recargar:
Y no olvide eliminar el observador:
fuente
user1046037 responder en Swift ...
fuente
UILabel
anterior, el contenido decollectionView
pasar por encima de otro elemento anterior, ¿tiene otra solución?Código Swift 3 para la respuesta del usuario 1046037
fuente
Rápido 4
fuente
Rápido 4.2
fuente
Es demasiado tarde para responder a esta pregunta, pero recientemente pasé por este problema.
La respuesta anterior de @ lee me ayudó mucho a obtener mi respuesta. Pero esa respuesta se limita a objetivo-c y estaba trabajando en rápido .
@lee Con referencia a su respuesta, permítame permitir que el usuario rápido resuelva este problema fácilmente. Para eso, siga los pasos a continuación:
Declare una
CGFloat
variable en la sección de declaración:En
viewDidAppear
puedes conseguirlo por:Tal vez cuando sus
reload
datos necesiten calcular una nueva altura con nuevos datos, entonces puede obtenerlos:addObserver
para escuchar cuando hayaCollectionView
terminado de recargar los datos enviewWillAppear
:Luego agregue la función de abajo para obtener una nueva altura o haga cualquier cosa después de
collectionview
terminar la recarga:Y no olvide eliminar el observador:
Espero que esto le ayude a resolver su problema rápidamente.
fuente
Esta respuesta se basa en @Er. La respuesta de Vihar. Puede implementar fácilmente la solución utilizando RxSwift
fuente
Versión rápida de @ user1046037:
fuente
Swift 4.2, Xcode 10.1, iOS 12.1:
Por alguna razón,
collectionView.contentSize.height
aparecía más pequeño que la altura resuelta de mi vista de colección. Primero, estaba usando una restricción de diseño automático relativa a la mitad de la altura de la supervista. Para solucionar esto, cambié la restricción para que sea relativa al "área segura" de la vista.Esto me permitió establecer la altura de la celda para llenar la vista de mi colección usando
collectionView.contentSize.height
:antes de
Después
fuente
asumiendo que su collectionView se denomina collectionView , puede tomar la altura de la siguiente manera.
fuente
Además, será mejor que llames
reloadData
antes de obtener la altura:fuente