Se está inyectando texto dinámico de longitud variable en las etiquetas de las celdas de la vista de tabla. Para que las alturas de las celdas de vista de tabla tengan un tamaño dinámico, lo 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 UITableViewAutomaticDimention
se llama 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()
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 método alternativo mejor.
fuente
Respuestas:
Prueba esto:
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { return UITableViewAutomaticDimension }
EDITAR
func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { return UITableViewAutomaticDimension }
Rápido 4
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { return UITableViewAutomaticDimension }
Rápido 4.2
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { return UITableView.automaticDimension }
Defina ambos métodos arriba.
Resuelve el problema.
PD: Se requieren restricciones superiores e inferiores para que esto funcione.
Aquí hay un ejemplo
fuente
Utilizar este:
tableView.rowHeight = UITableViewAutomaticDimension tableView.estimatedRowHeight = 300
y no use:
heightForRowAtIndexPath
función delegadaAdemás, en el guión gráfico no establezca la altura de la etiqueta que contiene una gran cantidad de datos. Dale
top, bottom, leading, trailing
restricciones.fuente
heightForRowAtIndexPath
SWIFT 3
tableView.rowHeight = UITableViewAutomaticDimension tableView.estimatedRowHeight = 160
¡¡¡Y!!! En StoryBoard: TIENE QUE establecer restricciones SUPERIORES E INFERIORES para su etiqueta. Nada más.
fuente
Este extraño error se resolvió mediante 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 de etiqueta predeterminado sea más grande de lo que podría ser el contenido y que también se refleje en la
estimatedRowHeight
altura. Anteriormente, configuré la altura de fila predeterminada en Interface Builder88px
y la reflejé así en mi controladorviewDidLoad()
: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 de lo que quizás
100px
, así que configuré la altura de celda predeterminada en108px
(más grande que el contenido potencial) y lo reflejé así en el controladorviewDidLoad()
:self.tableView.rowHeight = UITableViewAutomaticDimension self.tableView.estimatedRowHeight = 108.0
En realidad, esto permitió que el código redujera las etiquetas iniciales al tamaño correcto. En otras palabras, nunca se expandió a un tamaño más grande, pero siempre pudo encogerse ... Además, no
self.tableView.reloadData()
se necesitó nada adicionalviewWillAppear()
.Sé que esto no cubre tamaños de contenido muy variables, pero esto funcionó en mi situación donde el contenido tenía un número máximo de caracteres posible.
No estoy seguro de si esto es un error en Swift o Interface Builder, pero funciona como un encanto. ¡Darle una oportunidad!
fuente
Configure la dimensión automática para la altura de la fila y la altura estimada de la fila 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,
Aquí hay una etiqueta de muestra con restricciones de altura dinámicas.
fuente
La celda de tamaño dinámico de UITableView requería 2 cosas
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.
fuente
Para Swift 3 puedes usar lo siguiente:
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return UITableViewAutomaticDimension } func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { return UITableViewAutomaticDimension }
fuente
Para Swift 4.2
@IBOutlet weak var tableVw: UITableView! override func viewDidLoad() { super.viewDidLoad() // Set self as tableView delegate tableVw.delegate = self tableVw.rowHeight = UITableView.automaticDimension tableVw.estimatedRowHeight = UITableView.automaticDimension } // UITableViewDelegate Method func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return UITableView.automaticDimension }
Codificación feliz :)
fuente
Tratar
override func viewWillAppear(animated: Bool) { self.tableView.layoutSubviews() }
Tuve el mismo problema y me funciona.
fuente
Para hacer que el tamaño automático de UITableViewCell funcione, asegúrese de estar haciendo estos cambios:
En el conjunto de funciones viewDidLoad de su UIViewController debajo de las propiedades de UITableView:
self.tableView.estimatedRowHeight = <minimum cell height> self.tableView.rowHeight = UITableViewAutomaticDimension
fuente
<minimum cell height>
paraestimatedRowHeight
) realmente solucionó mi problema. Antes de esto, la celda tenía un tamaño automático, pero también recibía varias advertencias de restricciones. ¡Ahora no lo hago! ¡¡Muchas gracias, Anshul !!Para Swift, verifiqué 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 }
Aquí debe agregar restricciones superior, inferior, derecha e izquierda
fuente
En mi caso, en el guión gráfico tenía dos etiquetas como en la imagen a continuación, ambas etiquetas tenían los valores de ancho deseados establecidos antes de igualarlos. una vez que deseleccione, cambiará a automático y, como de costumbre, tener debajo las cosas debería funcionar a la perfección.
1.rowHeight = UITableView.automaticDimension, and 2.estimatedRowHeight = 100(In my case). 3.make sure label number of lines is zero.
fuente
Además de lo que otros han dicho,
¡ESTABLEZCA LAS RESTRICCIONES DE SU ETIQUETA EN RELACIÓN CON LA SUPERVISIÓN!
Entonces, en lugar de colocar las restricciones de su etiqueta en relación con otras cosas a su alrededor, limítelo a la vista de contenido de la celda de la vista de tabla.
Luego, asegúrese de que la altura de su etiqueta esté establecida en más o igual a 0, y que el número de líneas esté establecido en 0.
Luego
ViewDidLoad
agregue:tableView.estimatedRowHeight = 695 tableView.rowHeight = UITableViewAutomaticDimension
fuente
Esto es simple cuando se hacen 2 cosas:
tableView.rowHeight = UITableView.automaticDimension
Entonces, el motor de diseño puede calcular la altura de la celda y aplicar el valor correctamente.
fuente
Tu solución me inspiró y probé de otra manera.
Intente agregar
tableView.reloadData()
aviewDidAppear()
.Esto funciona para mi.
Creo que lo que hay detrás del desplazamiento es "lo mismo" que reloadData. Cuando te desplazas por la pantalla, es como llamar
reloadData()
cuandoviewDidAppear
.Si esto funciona, por favor responda esta respuesta para poder estar seguro de esta solución.
fuente
Desafortunadamente, no estoy seguro de lo que me estaba perdiendo. Los métodos anteriores no me funcionan para obtener la altura de la celda xib o dejar que layoutifneeded () o UITableView.automaticDimension hagan el cálculo de la altura. He estado buscando e intentando durante 3 o 4 noches pero no pude encontrar una respuesta. Sin embargo, algunas respuestas aquí o en otra publicación me dieron pistas para la solución. Es un método estúpido pero funciona. Simplemente agregue todas sus celdas en una matriz. Y luego configure la salida de cada una de sus restricciones de altura en el guión gráfico de xib. Finalmente, súmalos en el método heightForRowAt. Es sencillo si no está familiarizado con esas API.
Rápido 4.2
CustomCell.Swift
@IBOutlet weak var textViewOneHeight: NSLayoutConstraint! @IBOutlet weak var textViewTwoHeight: NSLayoutConstraint! @IBOutlet weak var textViewThreeHeight: NSLayoutConstraint! @IBOutlet weak var textViewFourHeight: NSLayoutConstraint! @IBOutlet weak var textViewFiveHeight: NSLayoutConstraint!
MyTableViewVC.Swift
. . var myCustomCells:[CustomCell] = [] . . override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = Bundle.main.loadNibNamed("CustomCell", owner: self, options: nil)?.first as! CustomCell . . myCustomCells.append(cell) return cell } override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { let totalHeight = myCustomCells[indexPath.row].textViewOneHeight.constant + myCustomCells[indexPath.row].textViewTwoHeight.constant + myCustomCells[indexPath.row].textViewThreeHeight.constant + myCustomCells[indexPath.row].textViewFourHeight.constant + myCustomCells[indexPath.row].textViewFiveHeight.constant return totalHeight + 40 //some magic number }
fuente
Yo uso estos
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return 100 }
fuente
Simplemente debe establecer todas las restricciones para SUPERIOR , INFERIOR y ALTURA para cada objeto en la vista de celda / vistas y eliminar la posición Y media existente si tiene. Porque donde no hiciste esto, coloca artefactos en otras vistas.
fuente
Para el objetivo c, esta es una de mis buenas soluciones. me ha funcionado.
- (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;
fuente
También tuve este problema inicialmente, resolví mi problema con este código, intente evitar el uso de en
self.tableView.reloadData()
lugar de este código para la altura dinámica[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationFade];
fuente
Cuando uso un static
UITableView
, configuro todos los valores enUILabel
sy luego llamotableView.reloadData()
.fuente
self.tableView.rowHeight = UITableViewAutomaticDimension self.tableView.estimatedRowHeight = 88.0
Y no olvide agregar restricciones de fondo para la etiqueta
fuente
Swift 5 Disfruta
tablev.rowHeight = 100 tablev.estimatedRowHeight = UITableView.automaticDimension func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = self.tablev.dequeueReusableCell(withIdentifier: "ConferenceRoomsCell") as! ConferenceRoomsCell cell.lblRoomName.numberOfLines = 0 cell.lblRoomName.lineBreakMode = .byWordWrapping cell.lblRoomName.text = arrNameOfRooms[indexPath.row] cell.lblRoomName.sizeToFit() return cell }
fuente
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);
fuente
Establezca la restricción adecuada y actualice los métodos delegados 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 la altura dinámica de la celda. SI no es necesario comprobar las limitaciones.
fuente