objective-c - inside - uicollectionview swift 3
Cambiar el tamaño de las celdas UICollectionView después de que se hayan establecido sus datos (4)
Las celdas de Mi UICollectionView contienen UILabels con texto multilínea. No sé la altura de las celdas hasta que el texto se haya establecido en la etiqueta.
-(CGSize)collectionView:(UICollectionView *)collectionView
layout:(UICollectionViewLayout*)collectionViewLayout
sizeForItemAtIndexPath:(NSIndexPath *)indexPath;
Este fue el método inicial que miré para dimensionar las células. Sin embargo, esto se llama ANTES de que las celdas se creen fuera del guión gráfico.
¿Hay alguna forma de disponer la colección y el tamaño de las celdas DESPUÉS de que se hayan procesado, y sé cuál es el tamaño real de la celda?
Creo que estás buscando el método invalidateLayout
que puedes llamar en la propiedad .collectionViewLayout
de tu UICollectionView. Este método regenera su diseño, que en su caso también significa llamar a -collectionView: layout: sizeForItemAtIndexPath:
que es el lugar correcto para reflejar el tamaño del elemento deseado. Jirune apunta la dirección correcta sobre cómo calcularlos.
Un ejemplo para el uso de invalidateLayout
se puede encontrar here . Consulte también la documentación de UICollectionViewLayout sobre ese método:
Invalida el diseño actual y activa una actualización de diseño.
Discusión:
Puede llamar a este método en cualquier momento para actualizar la información de diseño. Este método invalida el diseño de la vista de colección en sí y se devuelve de inmediato. Por lo tanto, puede llamar a este método varias veces desde el mismo bloque de código sin activar múltiples actualizaciones de diseño. La actualización de diseño real se produce durante el siguiente ciclo de actualización de diseño de vista.
Editar:
Para la vista de colección de guión gráfico que contiene restricciones de diseño automático, debe anular el método UIViewController
de UIViewController
y llamar al diseño de vista de colección invalidateLayout
en este método.
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
[yourCollectionView.collectionViewLayout invalidateLayout];
}
Oye, en el método de delegate
anterior, puedes calcular el tamaño de UILabel
utilizando la forma complicada que se encuentra a continuación y devolver el size
UICollectionViewCell
función de ese cálculo.
// Calculate the expected size based on the font and
// linebreak mode of your label
CGSize maximumLabelSize = CGSizeMake(9999,9999);
CGSize expectedLabelSize =
[[self.dataSource objectAtIndex:indexPath.item]
sizeWithFont:[UIFont fontWithName:@"Arial" size:18.0f]
constrainedToSize:maximumLabelSize
lineBreakMode:NSLineBreakByWordWrapping];
subclase UICollectionViewCell y anular layoutSubviews
como este
de este modo, anclará el borde anterior y posterior de la celda a la colecciónVer
override func layoutSubviews() {
super.layoutSubviews()
self.frame = CGRectMake(0, self.frame.origin.y, self.superview!.frame.size.width, self.frame.size.height)
}
- (void)viewDidLoad {
self.collectionView.prefetchingEnabled = NO;
}
En iOS 10, prefetchingEnabled
es YES
por defecto. Cuando es YES
, la vista de colección solicita celdas antes de cuando se mostrarán. Conduce a estrellarse en iOS 10.