ios - example - Autoresize UICollectionView height para ajustarse a su tamaño de contenido
uicollectionview swift 4 (4)
Tengo un UICollectionView, un botón que crea una nueva celda en la vista de colección. Y quiero que UICollectionView ajuste su tamaño según su tamaño de contenido (cuando hay una o dos celdas, entonces UICollectionView es corto, si hay muchas celdas UICollectionView es lo suficientemente grande).
Sé cómo obtener el tamaño del contenido:
collectionView.collectionViewLayout.collectionViewContentSize
Pero no tengo idea de dónde usar este valor. Apreciaría si alguien me ayudara a averiguar cómo hacer que UICollectionView ajuste automáticamente su altura.
UPD: publiqué en GitHub un proyecto de demostración que describe el problema: https://github.com/avokin/PostViewer
Debe limitar la altura de la vista de colección a la altura de su contenido:
Estoy usando SnapKit en el siguiente código.
Primero restringe los bordes de la vista de colección a su supervisión:
private func constrainViews() {
collectionView?.translatesAutoresizingMaskIntoConstraints = true
collectionView?.snp.makeConstraints { make in
make.edges.equalToSuperview()
heightConstraint = make.height.equalTo(0).constraint
}
}
A continuación, calcule la altura y establezca la altura en el desplazamiento de la restricción de altura. Estoy dejando que el diseño de flujo haga el trabajo y luego calculo la altura en función del borde inferior del último atributo de diseño:
override func viewDidLayoutSubviews() {
guard
let collectionView = collectionView,
let layout = collectionViewLayout as? UICollectionViewFlowLayout
else {
return
}
let sectionInset = layout.sectionInset
let contentInset = collectionView.contentInset
let indexPath = IndexPath(item: tags.count, section: 0)
guard let attr = collectionViewLayout.layoutAttributesForItem(at: indexPath) else {
return
}
// Note sectionInset.top is already included in the frame''s origin
let totalHeight = attr.frame.origin.y + attr.frame.size.height
+ contentInset.top + contentInset.bottom
+ sectionInset.bottom
heightConstraint?.update(offset: totalHeight)
}
Tenga en cuenta que en el ejemplo, siempre tengo una etiqueta especial que no está incluida en la cuenta de mis artículos, por lo que la línea:
let indexPath = IndexPath(item: tags.count, section: 0)
tendría que ser algo así como if items.count > 0 ... let indexPath = IndexPath(item: tags.count - 1, section: 0)
en la mayoría de los otros códigos.
No creo que el tamaño del contenido sea lo que buscas. Creo que está queriendo ajustar la cantidad de bienes raíces de pantalla consumidos por la vista de colección, ¿verdad? Eso va a requerir un ajuste del marco. El tamaño del contenido incluye el área fuera de pantalla (desplazamiento) así como la vista en pantalla.
No conozco nada que le impida cambiar el tamaño del marco sobre la marcha:
collectionView.frame = CGRectMake (x,y,w,h);
[collectionView reloadData];
Si te estoy entendiendo correctamente.
Pasos para cambiar el marco UICollectionView:
Establezca la propiedad "translatesAutoresizingMaskIntoConstraints" en YES para la vista supervisada de collectioview (si está utilizando AUTOLAYOUT)
A continuación, actualice el marco de collectioview como:
collectionView.frame = CGRectMake (x,y,w,h); [collectionView reloadData];
Use una restricción de altura para la vista de colección y actualice su valor con la altura del contenido cuando sea necesario. Ver esta respuesta: https://.com/a/20829728/3414722