uitableviewcell inside didselectitematindexpath collection objective-c uicollectionview uicollectionviewcell

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.