Problema de altura dinámica para las celdas UITableView (Swift)

El texto dynamic de longitud variable se está inyectando en tags de celda de vista de tabla. Para que las alturas de las celdas de tabla tengan un tamaño dynamic, las he implementado en viewDidLoad() :

 self.tableView.estimatedRowHeight = 88.0 self.tableView.rowHeight = UITableViewAutomaticDimension 

Esto funciona muy bien para las celdas que aún no se han desplazado (como se llama a UITableViewAutomaticDimention al desplazarse a la celda), pero no para las celdas que se muestran inicialmente en pantalla al cargar la tabla con datos.

Intenté simplemente volver a cargar los datos (como se sugiere en muchos otros recursos):

 self.tableView.reloadData() 

en ambos viewDidAppear() y viewWillAppear() y fue en vano. Estoy perdido … ¿alguien sabe cómo hacer que xcode represente la altura dinámica de las celdas cargadas inicialmente en la pantalla?

Por favor, avíseme si hay un mejor método alternativo.

Prueba esto:

 func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { return UITableViewAutomaticDimension } 

EDITAR

 func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { return UITableViewAutomaticDimension } 

Swift 4

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

Definir arriba ambos métodos.
Resuelve el problema.

PD: se requieren restricciones superiores e inferiores para que esto funcione.

Aquí hay un ejemplo

Utilizar esta:

 tableView.rowHeight = UITableViewAutomaticDimension tableView.estimatedRowHeight = 300 

y no use: función de delegado heightForRowAtIndexPath

Además, en la historia del tablero no establezca la altura de la etiqueta que contiene una gran cantidad de datos. Déle restricciones top, bottom, leading, trailing .

SWIFT 3

 tableView.rowHeight = UITableViewAutomaticDimension tableView.estimatedRowHeight = 160 

¡¡¡Y!!! En storyBoard: TIENE que establecer restricciones TOP & BOTTOM para su etiqueta. Nada más.

Este extraño error se resolvió a través de los parámetros de Interface Builder, ya que las otras respuestas no resolvieron el problema.

Todo lo que hice fue hacer que el tamaño predeterminado de la etiqueta fuera más grande que el contenido podría ser potencialmente y que se reflejara en la altura estimatedRowHeight RowHeight también. Previamente, configuré la altura de fila predeterminada en Interface Builder a 88px y la 88px como en mi controlador viewDidLoad() :

 self.tableView.rowHeight = UITableViewAutomaticDimension self.tableView.estimatedRowHeight = 88.0 

Pero eso no funcionó. Entonces me di cuenta de que el contenido nunca llegaría a ser más grande que quizás 100px , así que configuré la altura predeterminada de la celda en 108px (mayor que el contenido potencial) y la viewDidLoad() como en el controlador viewDidLoad() :

 self.tableView.rowHeight = UITableViewAutomaticDimension self.tableView.estimatedRowHeight = 108.0 

Esto de hecho permitió que el código redujera las tags iniciales al tamaño correcto. En otras palabras, nunca se expandió a un tamaño mayor, pero siempre podría reducirse … Además, no se necesitaba viewWillAppear() en viewWillAppear() .

Sé que esto no cubre los tamaños de contenido altamente variables, pero esto funcionó en mi situación en que el contenido tenía un recuento máximo posible de caracteres.

No estoy seguro si esto es un error en Swift o Interface Builder, pero funciona como un encanto. ¡Darle una oportunidad!

La celda de tamaño dynamic de UITableView requiere 2 cosas

  1. Establecer la restricción correcta de su vista dentro de la celda de la vista de tabla (principalmente incluye darle a su vista las restricciones adecuadas de arriba, abajo y de trailing)
  2. Llamar a estas propiedades de TableView en viewDidLoad ()

      tableView.rowHeight = UITableViewAutomaticDimension tableView.estimatedRowHeight = 140 

Este es un maravilloso tutorial sobre el auto-tamaño (celdas de vista de tabla dinámica) escrito en swift 3.

Establezca la dimensión automática para la altura de fila y la altura de fila estimada y asegúrese de seguir los siguientes pasos:

 @IBOutlet weak var table: UITableView! override func viewDidLoad() { super.viewDidLoad() // Set automatic dimensions for row height // Swift 4.2 onwards table.rowHeight = UITableView.automaticDimension table.estimatedRowHeight = UITableView.automaticDimension // Swift 4.1 and below table.rowHeight = UITableViewAutomaticDimension table.estimatedRowHeight = UITableViewAutomaticDimension } // UITableViewAutomaticDimension calculates height of label contents/text func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { // Swift 4.2 onwards return UITableView.automaticDimension // Swift 4.1 and below return UITableViewAutomaticDimension } 

Por ejemplo: si tiene una etiqueta en su UITableviewCell, entonces,

  • Establecer el número de líneas = 0 (y el modo de salto de línea = cola truncada)
  • Establezca todas las restricciones (arriba, abajo, derecha a la izquierda) con respecto a su supervista / contenedor de celda.
  • Opcional : configure la altura mínima para la etiqueta, si desea que la etiqueta cubra el área vertical mínima, incluso si no hay datos.

Aquí hay una etiqueta de muestra con restricciones dinámicas de altura.

enter image description here

Para Swift 3 puede usar lo siguiente:

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

Tratar

 override func viewWillAppear(animated: Bool) { self.tableView.layoutSubviews() } 

Tuve el mismo problema y me funciona.

Me inspiré en su solución y probé de otra manera.

Intente agregar tableView.reloadData() a viewDidAppear() .

Esto funciona para mí

Creo que lo que hay detrás del desplazamiento es “lo mismo” que reloadData. Cuando se desplaza por la pantalla, es como llamar a reloadData() cuando viewDidAppear .

Si esto funciona, respondo esta respuesta para poder estar seguro de esta solución.

Para hacer que el ajuste de UITableViewCell funcione, asegúrese de realizar estos cambios:

  • En Storyboard, su UITableView solo debe contener celdas de prototipo dynamic (no debe usar celdas estáticas) de lo contrario, el autoajuste no funcionará.
  • En Storyboard, su UILabel de UITableViewCell se ha configurado para las 4 restricciones que son las restricciones superior, inferior, inicial y final.
  • En Storyboard, el número de líneas de UILabel de su UITableViewCell debe ser 0
  • En la función viewDidLoad de tu UIViewController, configura debajo de las propiedades de UITableView:

     self.tableView.estimatedRowHeight =  self.tableView.rowHeight = UITableViewAutomaticDimension 

Debería establecer todas las restricciones para ARRIBA , ABAJO y ALTURA para cada objeto en la vista / vistas de celda y eliminar la posición Y media si lo tiene. Porque donde no lo hiciste, coloca artefactos en otros puntos de vista.

Para el objective c esta es una de mi buena solución. funcionó para mí

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { cell.textLabel.text = [_nameArray objectAtIndex:indexPath.row]; cell.textLabel.numberOfLines = 0; cell.textLabel.lineBreakMode = NSLineBreakByWordWrapping; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return UITableViewAutomaticDimension; } 

Necesitamos aplicar estos 2 cambios.

 1)cell.textLabel.numberOfLines = 0; cell.textLabel.lineBreakMode = NSLineBreakByWordWrapping; 2)return UITableViewAutomaticDimension; 

Para Swift, comprobé esta respuesta en iOS 9.0 y iOS 11 también (Xcode 9.3)

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

También tuve este problema inicialmente, resolví mi problema desde este código, bash evitar el uso de self.tableView.reloadData() lugar de este código para la altura dinámica

 [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationFade]; 

Además de lo que otros han dicho,

¡CONFIGURE LAS LIMITACIONES DE SU ETIQUETA RELATIVAS A LA SUPERVISIÓN!

Por lo tanto, en lugar de colocar las restricciones de su etiqueta en relación con otras cosas a su alrededor, constrúyelo a la vista de contenido de la celda de la vista de tabla.

Luego, asegúrese de que la altura de su etiqueta esté configurada en más de o igual a 0, y la cantidad de líneas esté configurada en 0.

Luego en ViewDidLoad agrega:

tableView.estimatedRowHeight = 695

tableView.rowHeight = UITableViewAutomaticDimension

 enter code here self.Itemtableview.estimatedRowHeight = 0; self.Itemtableview.estimatedSectionHeaderHeight = 0; self.Itemtableview.estimatedSectionFooterHeight = 0; [ self.Itemtableview reloadData]; self.Itemtableview.frame = CGRectMake( self.Itemtableview.frame.origin.x, self.Itemtableview.frame.origin.y, self.Itemtableview.frame.size.width,self.Itemtableview.contentSize.height + self.Itemtableview.contentInset.bottom + self.Itemtableview.contentInset.top); 

Establezca la restricción adecuada y actualice los métodos de delegado como:

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

Esto resolverá el problema de altura de celda dinámica. SI no es necesario que compruebe las restricciones.

    Intereting Posts