uicollectionviewflowlayoutautomaticsize uicollectionviewdelegateflowlayout systemlayoutsizefitting automatic ios uitableview autolayout uicollectionviewcell

ios - uicollectionviewdelegateflowlayout - UICollectionVIew dentro de UITableViewCell cómo obtener altura dinámica con autolayout



uicollectionviewcell size (1)

Sé que hay una pregunta similar, pero me gustaría dar más pistas sobre cómo traté de lograr eso, ya que la pregunta original no da ningún consejo.
Tengo una UITableViewCell como subvista de contentView hay un UICollectionView , me gustaría tener la altura de la celda en función de collectionview contentSize , la celda de la vista de tabla es el delegado de la vista de recopilación y el origen de datos.
La vista de la colección debe fijarse sin posibilidades de desplazamiento en un flujo vertical y debe adaptar su altura al número de líneas celulares.
Para hacer eso, he tratado de utilizar la misma técnica que uso con las celdas comunes de la vista de tabla. Creo una celda falsa y guardo una referencia a ella, luego en el método - (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath la celda con los datos que debería mostrar y luego le pido a su altura para tamaño comprimido.
Algo como eso:

- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { CGSize size = CGSizeZero; NSDictionary * data = self.data[indexPath.row]; if (data[KEY_CELL_IDENTIFIER] == CellIdentifierPost) { NSNumber * cachedHeight = [self.heightCaches objectForKey:[(PostObject*)data[KEY_CELL_DATA] postObjectId]]; if (cachedHeight) { return (CGFloat)[cachedHeight doubleValue]; } [_heightCell configureCellWith:data[KEY_CELL_DATA]]; size = [_heightCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]; [self.heightCaches setObject:@(size.height) forKey:[(PostObject*)data[KEY_CELL_DATA] postObjectId]]; } else if (data[KEY_CELL_IDENTIFIER] == CellIdentifierComment){ size = (CGSize) { .width = NSIntegerMax, .height = 160.f }; } else { size = (CGSize) { .width = NSIntegerMax, .height = 50.f }; } return size.height; }

Este método funciona realmente bien para las otras celdas, pero no para esta, el resultado es una celda totalmente comprimida con casi una altura cero.
El problema parece deberse a la ubicación de las celdas internas. Incluso si después de alimentar los datos -collectionView:cellForItemAtIndexPath: la vista de recopilación para volver a cargar datos, parece que nunca llama a -collectionView:cellForItemAtIndexPath: esto sucede probablemente porque la celda aún no se muestra.
Hay un trabajo alrededor?


Te recomendaría crear una restricción de altura para tu collectionView.

Luego, en función del número de celdas, puede calcular la altura para él y, al final, actualizar esa restricción y llamar a [collectionView setNeedsUpdateConstraints]