uitableviewcontroller uitableviewcell tutorial example ios uitableview swift uikit

ios - tutorial - uitableviewcell lifecycle



UITableViewAutomaticDimension no funciona hasta que se desplaza (11)

Cuando la Vista de tabla se carga por primera vez, todas las celdas visibles son el valor estimado de RowHeight. A medida que me desplazo hacia abajo, las celdas se dimensionan automáticamente de manera adecuada y, cuando vuelvo hacia arriba, las celdas que inicialmente se estimaron, RowHeight se están dimensionando automáticamente de manera adecuada.

Una vez que las celdas se están dimensionando automáticamente, parece que nunca vuelven a ser la Raza estimada.

override func viewDidLoad() { super.viewDidLoad() self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil) self.tableView.estimatedRowHeight = 80.0 self.tableView.rowHeight = UITableViewAutomaticDimension // Uncomment the following line to preserve selection between presentations // self.clearsSelectionOnViewWillAppear = false // Uncomment the following line to display an Edit button in the navigation bar for this view controller. // self.navigationItem.rightBarButtonItem = self.editButtonItem() }

y

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cellIdentifier = "Cell" let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as CustomTableViewCell // Configure the cell... let restaurant = restaurants[indexPath.row] cell.namelabel.text = restaurant.name cell.locationlabel.text = restaurant.location cell.typelabel.text = restaurant.type cell.thumbnailImageView.image = UIImage(named: restaurant.image) cell.thumbnailImageView.layer.cornerRadius = cell.thumbnailImageView.frame.size.width / 2 cell.thumbnailImageView.clipsToBounds = true cell.accessoryType = restaurant.isVisited ? .Checkmark : .None return cell }

¿Pensamientos sobre cómo hacer que las células se autoricen inicialmente?

ACTUALIZACIÓN: a partir de Xcode 7 beta 6 esto ya no es un problema


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

En la función, configure la celda con el contenido preferido para que UITableViewAutomaticDimension funcione sin problemas.

El problema se debe a que el contenido de la celda se carga en alguna otra función de delegado, por lo que puede ver que las celdas se redimensionan automáticamente al tamaño requerido.


Asegúrese de tableView:cellForRowAt: su celda en tableView:cellForRowAt: Me he encontrado con este problema incluso con Xcode 8 cuando estaba configurando el contenido de la celda en tableView:willDisplay:forRowAt:


Creo que las respuestas here tienen menos efectos secundarios. Específicamente agregando cell.layoutIfNeeded() en tableView:cellForRowAtIndexPath:

También estoy haciendo lo que @nosov sugiere como una buena práctica, pero no he probado si es necesario que se realicen en conjunto.


Me encontré con el mismo problema y descubrí que el accesorio cell.accessoryType mete con este cambio de tamaño automático cuando no es None , por lo que parece ser un error en Xcode en este momento.

Pero como mencionó @Blankarsch, llamar a reloadSections(..) ayuda a solucionar este problema si necesita tener un accesorio.


Para mí lo que resolvió fue la combinación de la respuesta de @ [David Hernández].

Se eliminó la selección de arriba, y en layoutsubviews de Cell, establezco el valor preferido de MaxLayoutWidth como este (cambie 30 al espacio deseado a la izquierda)

-(void) layoutSubviews { [super layoutSubviews]; self.textDescriptionLabel.preferredMaxLayoutWidth = self.frame.size.width - 30; }


Para mí, solo tengo este problema cuando uso la celda willDisplay para configurar el texto de mis etiquetas

Si configuro el texto de mis etiquetas en la ruta del índice cellForRowAt, todo está bien


Si establece sus restricciones en función de la celda en sí (en lugar de la vista de contenido de la celda), la tabla no puede obtener el tamaño adecuado. Por lo tanto, para solucionar este problema, sus restricciones deben establecerse en la vista de contenido.

Sin embargo, esto es un problema cuando sus celdas admiten ambas configuraciones con / sin vista de accesorios. En ese caso, la vista de contenido cambia de tamaño según la vista de accesorios, y el resultado puede no ser el esperado por el usuario. Entonces, en este caso, una solución es establecer 2 restricciones, una para la celda y una segunda con menor prioridad para la vista de contenido de la celda.


Simplemente llame a "reloadSections" después de cargar la tabla:

self.tableView.reloadSections(NSIndexSet(indexesInRange: NSMakeRange(0, self.tableView.numberOfSections())), withRowAnimation: .None)

O en Swift 3:

let range = Range(uncheckedBounds: (lower: 0, upper: self.tableView.numberOfSections)) self.tableView.reloadSections(IndexSet(integersIn: range), with: .none)


Solo asegúrese de que sus etiquetas no tengan un tamaño de contenido explícito establecido en Interface Builder. Deben ser automáticos como la captura de pantalla de abajo para que la altura de la fila automática funcione correctamente sin la necesidad de volver a cargar ninguna sección por adelantado.


Xcode 9.3, Swift 4.1 sumando

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return UITableViewAutomaticDimension }

además de

func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { return UITableViewAutomaticDimension }

trabajó para mi.


acaba de anular estimadoHeightForRowAtIndexPath como este

(CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath { return UITableViewAutomaticDimension; }

y verifique las restricciones de su AutoLayout en la vista CustomTableViewCell.