working uitableviewcell not ios objective-c swift uitableview row-height

ios - uitableviewcell - ¿Por qué UITableViewAutomaticDimension no funciona?



uitableviewautomaticdimension not working (16)

Hola, hay muchas preguntas para responder a la altura dinámica de UITableViewCell de UITableView . Sin embargo, me parece extraño cuando lo hice.

Estas son algunas de las respuestas:

here y here

generalmente esto respondería la altura dinámica de la celda

tableView.estimatedRowHeight = 44.0 tableView.rowHeight = UITableViewAutomaticDimension

pero en mi caso, me pregunto si esta línea no hará nada.

mi UITableView se está viendo después de hacer clic en la barra de pestañas dentro de la vista dividida. ¿Esto es útil?

Tal vez me estoy perdiendo algo. ¿Alguien podría ayudarme? Pasé 2 horas haciendo tonterías.

Estas son mi restricción para el título, el título podría ser largo pero la etiqueta no lo es.

y esta es mi celular


Olvidé eliminar tableView(heightForRowAt:indexPath:)

Podría ser el caso de que, como yo, accidentalmente olvidó eliminar el código heightForRowAt para el método heightForRowAt .

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


A partir de iOS 11 y Xcode 9.3, la mayoría de la información anterior es incorrecta. La Guía de Apple sugiere configurar

tableView.estimatedRowHeight = 85.0 tableView.rowHeight = UITableViewAutomaticDimension

La sesión 245 de WWDC 2017 (Creación de aplicaciones con tipo dinámico, aproximadamente 16:33 en el video) sugiere algo similar. Nada de esto hizo una diferencia para mí.

Para una celda de estilo de Subtítulo, todo lo que se necesita para obtener celdas de vista de tabla de tamaño automático es establecer el número de líneas (en la sección Etiqueta del inspector de atributos) en 0 para el Título y el Subtítulo. Si una de estas etiquetas es demasiado larga y no establece el número de líneas en 0, la celda de la vista de tabla no ajustará su tamaño.


Asegúrese de que todas las vistas en la celda estén restringidas a la Vista de contenido y no a la celda.

Como dice apple:

diseñar el contenido de la celda de vista de tabla dentro de la vista de contenido de la celda. Para definir la altura de la celda, necesita una cadena ininterrumpida de restricciones y vistas (con alturas definidas) para llenar el área entre el borde superior de la vista de contenido y su borde inferior.


En mi caso tuve dos UITableViews, tuve que modificar este método como

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ CGFloat height = 0.0; if (tableView == self.tableviewComments) { return UITableViewAutomaticDimension; }else if (tableView == self.tableViewFriends) { height = 44.0; } return height; }


Para cualquiera que tal vez enfrentara el mismo problema conmigo: luché durante una hora para que funcionara. Una etiqueta de usuario simple con restricciones superior, inferior izquierda y derecha. Usé willDisplayCell para pasar los datos a la celda y esto estaba causando problemas en la altura de las celdas. Mientras coloque ese código en cellForRow, todo funcionó bien. No entendí por qué sucedió esto, tal vez la altura de la celda se calculó antes de que se llamara willDisplayCell, por lo que no había contenido para hacer el cálculo correcto. Solo quería mencionar y probablemente ayudar a alguien con el mismo problema.


Para establecer la dimensión automática para la altura de la fila y la altura estimada de la fila, asegúrese de seguir los siguientes pasos para que la dimensión automática sea efectiva para el diseño de altura de celda / fila.

  • Asignar e implementar datos de vista de tabla Fuente y delegar
  • Asigne UITableViewAutomaticDimension a rowHeight y estimadoRowHeight
  • Implemente métodos delegate / dataSource (es decir, heightForRowAt y devuelva un valor UITableViewAutomaticDimension )

-

C objetivo:

// in ViewController.h #import <UIKit/UIKit.h> @interface ViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> @property IBOutlet UITableView * table; @end // in ViewController.m - (void)viewDidLoad { [super viewDidLoad]; self.table.dataSource = self; self.table.delegate = self; self.table.rowHeight = UITableViewAutomaticDimension; self.table.estimatedRowHeight = UITableViewAutomaticDimension; } -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return UITableViewAutomaticDimension; }

Rápido:

@IBOutlet weak var table: UITableView! override func viewDidLoad() { super.viewDidLoad() // Don''t forget to set dataSource and delegate for table table.dataSource = self table.delegate = self // 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 }

Para instancia de etiqueta en UITableviewCell

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

Nota : Si tiene más de una etiqueta (UIElements) con longitud dinámica, que debe ajustarse de acuerdo con su tamaño de contenido: Ajuste ''Prioridad de contenido y Resistencia a la compresión'' para las etiquetas que desea expandir / comprimir con mayor prioridad.


Para mi configuración, primero verifiqué las restricciones en el Storyboard para que UITableViewCell no fueran ambiguas de arriba a abajo, y luego tuve que modificar el código en 2 lugares.

  1. UITableViewDelegate de tableView(_:heightForRowAt:)

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return UITableView.automaticDimension // return UITableViewAutomaticDimension for older than Swift 4.2 }

  2. UITableViewDelegate de tableView(_:estimatedHeightForRowAt:)

    func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { return UITableView.automaticDimension // return UITableViewAutomaticDimension for older than Swift 4.2 }

Los pasos 1 y 2 le permiten aplicar el tamaño automático solo para filas particulares. Para aplicar a todo UITableView , use:

tableView.rowHeight = UITableView.automaticDimension tableView.estimatedRowHeight = UITableView.automaticDimension // return UITableViewAutomaticDimension for older than Swift 4.2


Para que UITableViewAutomaticDimension funcione, debe asegurarse de que las restricciones de las 4 esquinas se agreguen a la supervista. En la mayoría de los casos, funciona bien con UILabel, pero a veces encuentro que UITextView funciona cuando UILabel no funciona bien en ese momento. Por lo tanto, intente cambiar a UITextView y asegúrese de que el Scrolling Enabled esté desmarcado en el guión gráfico, o también puede configurarlo mediante programación.


Para que UITableViewAutomaticDimension funcione, debe establecer todas las restricciones izquierda, derecha, inferior y superior relativas a la vista del contenedor de celdas. En su caso, deberá agregar el espacio inferior faltante a la restricción de supervisión para la etiqueta debajo del título


Prueba esto, solución simple, es trabajo para mí,

En viewDidLoad, escriba este código,

-(void)viewDidLoad { [super viewDidLoad]; self.tableView.estimatedRowHeight = 100.0; // for example. Set your average height self.tableView.rowHeight = UITableViewAutomaticDimension; }

En cellForRowAtIndexPath escriba este código,

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] ; } cell.textLabel.numberOfLines = 0; // Set label number of line to 0 cell.textLabel.text=[[self.arForTable objectAtIndex:indexPath.row] valueForKey:@"menu"]; [cell.textLabel sizeToFit]; //set size to fit return cell; }


También asegúrese de que las Líneas para su UILabel en la celda estén configuradas en 0. Si está configurado en 1, no crecerá verticalmente.


Tenía tres elementos horizontales y el más izquierdo tenía una restricción a la izquierda, el medio tenía arriba, abajo, al elemento izquierdo y al elemento derecho. El derecho tenía un derecho y un elemento izquierdo al medio. La solución fue agregar restricciones adicionales izquierda y derecha al elemento central (mi etiqueta) que eran> = algún número en la celda.


Tengo un caso específico y el 99% de las soluciones que leí no funcionaron. Pensé en compartir mi experiencia. Espero que pueda ayudar, ya que tuve problemas durante un par de horas antes de solucionar este problema.

Mi escenario :

  • Estoy usando dos TableViews en un ViewController
  • Estoy cargando celdas personalizadas (xib) en esas vistas de tabla
  • El contenido dinámico en las celdas consta de dos etiquetas.
  • La página usa una vista de desplazamiento

Lo que necesitaba para lograr :

  • Altura dinámica de TableView
  • Altura dinámica de TableViewCells

Lo que necesitará verificar para que funcione sin problemas :

  • Como cada tutorial y respuesta le dirá, establezca todas las restricciones para su etiqueta / contenido (arriba, abajo, al principio y al final), y configúrelo en ContentView (Superview). Este video tutorial será útil .

  • En el método viewWillAppear de mi ViewController, le doy a uno de mis tableViews ( tableView2 ) una altura de fila estimada y luego uso UITableViewAutomaticDimension como tal (y como se ve en todos los tutoriales / respuestas):

    override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) tableView2.estimatedRowHeight = 80 tableView2.rowHeight = UITableViewAutomaticDimension }

Para mí, estos pasos anteriores no fueron suficientes. Mi TableView simplemente tomaría el estimadoRowHeight y lo multiplicaría por el número de celdas. Meeeh

  • Como estoy usando dos tableViews diferentes, creé una salida para cada uno de ellos, tableView1 y tableView2 . Permitiéndome cambiar su tamaño en el método viewDidLayoutSubviews . Siéntase libre de preguntar en comentarios cómo hice esto.

  • Un paso adicional lo arregló para mí, al agregar esto al método viewDidAppear :

    override func viewDidAppear(_ animated: Bool) { tableView1.reloadData() // reloading data for the first tableView serves another purpose, not exactly related to this question. tableView2.setNeedsLayout() tableView2.layoutIfNeeded() tableView2.reloadData() }

Espero que ayude a alguien!


Tengo una nueva solución ... eso me funcionó.

básicamente UITableViewAutomaticDimension renombrado como UITableView.automaticDimension ... UITableView.automaticDimension ... wo


funcionó bien para mí en iOS 11 y superior, mientras que en iOS 10 la solución fue agregar

table.rowHeight = UITableView.automaticDimension table.estimatedRowHeight = 200 // a number and not UITableView.automaticDimension

también asegúrese de agregar "heightForRowAt" incluso si funciona en iOS 11 y superior, es necesario si es compatible con iOS 10

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


contentView restricciones mediante programación y las agregué accidentalmente a la celda directamente, es decir, no a la propiedad contentView . ¡Agregar las restricciones a contentView resolvió por mí!