uitableviewcell ios uitableview ios8 resize storyboard

ios - UITableViewCell necesita reloadData() para cambiar el tamaño y corregir la altura



swift uitableviewcell height (1)

Sí. En realidad, se trata de un problema de autoevaluación al que hay que evitar hasta que se solucione.

El problema es que cuando se crea una instancia de una celda, su ancho inicial se basa en el ancho del guión gráfico. Dado que esto es diferente del ancho de tableView , el diseño inicial determina incorrectamente cuántas líneas el contenido realmente requeriría.

Esta es la razón por la cual el contenido no está dimensionado correctamente la primera vez, pero aparece correctamente una vez que (vuelve a cargar los datos, o) desplaza la celda fuera de la pantalla y luego aparece en la pantalla.

Puede evitar esto asegurando que el ancho de la celda coincida con el ancho de la vista de tableView . Su diseño inicial será entonces correcto, eliminando la necesidad de volver a cargar tableView:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; [cell adjustSizeToMatchWidth:CGRectGetWidth(self.tableView.frame)]; [self configureCell:cell forRowAtIndexPath:indexPath]; return cell; }

En TableViewCell.m:

- (void)adjustSizeToMatchWidth:(CGFloat)width { // Workaround for visible cells not laid out properly since their layout was // based on a different (initial) width from the tableView. CGRect rect = self.frame; rect.size.width = width; self.frame = rect; // Workaround for initial cell height less than auto layout required height. rect = self.contentView.bounds; rect.size.height = 99999.0; rect.size.width = 99999.0; self.contentView.bounds = rect; }

También recomendaría ver la excelente respuesta de smileyborg sobre las celdas de autoevaluación , junto con su código de muestra . Es lo que me inclinó a la solución, cuando me topé con el mismo problema que está teniendo.

Actualizar:

configureCell:forRowAtIndexPath: es un enfoque que Apple usa en su código de muestra. Cuando tiene más de un tableViewController , es común tableViewController una subclase, y dividir el código cellForRowAtIndexPath: específico del controlador dentro de cada controlador de vista. La superclase maneja el código común (como la dequeración de celdas) y luego llama a la subclase para que pueda configurar las vistas de la celda (que variarían de controlador a controlador). Si no usa subclases, simplemente reemplace esa línea con el código específico para establecer las propiedades de su celda (personalizadas):

cell.textLabel.text = ...; cell.detailTextLabel.text = ...;

Tengo una celda de vista de tabla personalizada con restricciones aplicadas pero la primera vez que se muestra la tabla, la altura de la fila no se redimensiona correctamente a menos que se creen nuevas celdas, ¿hay alguna manera de hacerlo sin llamar de nuevo a reloadData?