UITableView ContentSize cuando se usa la altura dinámica en UITableViewCells

He estado buscando esto por muchas horas, pero no encontré la manera de hacerlo.

Tengo una UITableView cuyas UITableViewCells usan AutomaticDimension for Height:

 tableView.RowHeight = UITableView.AutomaticDimension; tableView.EstimatedRowHeight = 160f; 

El problema es cuando bash get ContentSize de TableView. Parece que se calcula en function de EstimatedRowHeight lugar de la altura actual de sus filas. Supongamos que, si hay 10 celdas, el valor devuelto de ContentSize es 160×10.

Entonces mi pregunta es si hay una manera de hacer esto.

Cualquier ayuda será muy apreciada … Utilizo Xamarin.iOS, pero las respuestas Obj-C y Swift son obviamente bienvenidas 🙂

Creo que la respuesta de @Daniel J solo funciona debido a la forma en que está progtwigdo el controller de finalización de la animation, a simple vista, no hay garantía de que la recarga de la tabla haya ocurrido antes de que se complete la animation.

Creo que una mejor solución es (en Swift, ya que eso es lo que estaba usando): –

 func reloadAndResizeTable() { self.tableView.reloadData() dispatch_async(dispatch_get_main_queue()) { self.tableHeightConstraint.constant = self.tableView.contentSize.height UIView.animateWithDuration(0.4) { self.view.layoutIfNeeded() } } } 

De hecho, utilicé la demora de animation debido al efecto que quería, pero también funciona con una duración de cero. Llamo a esta function cada vez que actualizo los contenidos de la tabla y la anima y networkingimensiona según sea necesario.

Tuve un escenario en el que también necesitaba conocer contentSize, para establecer el marco en un tableView no-fullscreen que tenía diferentes recuentos de celdas de diferentes alturas. Luego ajustaría el tableView (a través de NSLayoutConstraint) para que sea el alto de ese contenido.

Lo siguiente funcionó, aunque creo que es un poco hacky:

Configurar todo el código en 'viewDidLoad'
Establezca rowHeight en automático
Establezca estimatedRowHeight en un valor mayor que el esperado para una celda (en este caso, no esperaba que una celda fuera más alta que 60pts aproximadamente, por lo tanto, establezca la estimación en 120)
Ajustar la recarga de la tablaView en un bloque de animation y luego consultar el contenido Tamaño y tomar la acción adecuada en el bloque de finalización

 - (void)viewDidLoad { [super viewDidLoad]; self.tableView.rowHeight = UITableViewAutomaticDimension; self.tableView.estimatedRowHeight = 120.0; [UIView animateWithDuration:0 animations:^{ [self.tableView reloadData]; } completion:^(BOOL finished) { self.tableViewHeight.constant = self.tableView.contentSize.height; [self.view layoutIfNeeded]; }]; }