Cómo establecer el tamaño dynamic de uicollectionviewcell a partir de su contenido: programáticamente

Necesito tener un simple estilo de UICollectionViewCell con celdas en la parte superior de cada uno. Me gusta tableview. Pero necesito altura dinámica dependiente del contenido, el tamaño del contenido es comentarios puede variar.

Obtuve viewDidLoad:

[self.commentsCollectionView registerClass:[GWCommentsCollectionViewCell class] forCellWithReuseIdentifier:@"commentCell"]; 

en .h tengo:

y yo #importe mi UICollectionViewCell personalizado que establece todas las restricciones con autoajuste programático.

Instancio UICollectionView con:

 UICollectionViewFlowLayout *collViewLayout = [[UICollectionViewFlowLayout alloc]init]; self.commentsCollectionView = [[UICollectionView alloc]initWithFrame:CGRectZero collectionViewLayout:collViewLayout]; 

Utilizo autolatyout para que UICollectionView esté donde quiera (por eso CGRectZero).

Y finalmente esperaba hacer esto:

 -(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{ GWCommentsCollectionViewCell *cell = (GWCommentsCollectionViewCell*)[collectionView cellForItemAtIndexPath:indexPath]; return cell.singleCommentContainerview.bounds.size; } 

singleCommentContainerview es una subvista directa de contentView y con el singleCommentContainerview tengo UILabels, UIImageViews, etc., todos configurados con código autolayout.

Pero acabo de get el valor cgsize de (0,0)

¿Cómo puedo arreglar esto para get el tamaño adecuado que necesito para cada celda?

Por lo que he leído, UICollectionView necesita que los tamaños se solucionen antes de desplegar la celda. Entonces, el método anterior de la tuya, esa celda aún no se ha dibujado, por lo que no tiene tamaño. También podría ser un problema o combinarse con el problema de que la celda se almacena en caching / agrupa con el mismo identificador @ "commentCell", labelré celdas únicas con un nuevo identificador y class normalmente.

Mis pensamientos son atrapar la celda antes de dibujarla, hacer que el tamaño se convierta en un dictionary para usarlo más tarde, usando:

 - (void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath{ GWCommentsCollectionViewCell *cell = (GWCommentsCollectionViewCell*)[collectionView cellForItemAtIndexPath:indexPath]; // Need to add it to the view maybe in order for it the autolayout to happen [offScreenView addSubView:cell]; [cell setNeedsLayout]; CGSize *cellSize=cell.singleCommentContainerview.bounds.size NSString *key=[NSString stringWithFormat:@"%li,%li",indexPath.section,indexPath.row]; // cellAtIndexPath is a NSMutableDictionary initialised and allocated elsewhere [cellAtIndexPath setObject:[NSValue valueWithCGSize:cellSize] forKey:key]; } 

Luego, cuando lo necesite, use ese dictionary basado en la key para get el tamaño.

No es una súper bonita, ya que depende de que se dibujen las vistas, de que la reproducción automática funciona antes de get el tamaño. Y si está cargando imágenes aún más podría arrojar problemas.

Tal vez una mejor manera sería preprogtwigr los tamaños. Si tiene datos sobre los tamaños de imágenes que pueden ayudar. Consulte este artículo para get un tutorial realmente bueno (yah programáticamente no IB):

https://bradbambara.wordpress.com/2014/05/24/getting-started-with-custom-uicollectionview-layouts/

Añadir

 class func size(data: WhateverYourData) -> CGSize { /* calculate size here and retrun it */} 

a tu celda personalizada y en lugar de hacerlo

 return cell.singleCommentContainerview.bounds.size 

debería ser

 return GWCommentsCollectionViewCell.size(data)