working uitableviewcell not ios swift uitableview autolayout uilabel

ios - uitableviewcell - uitableviewautomaticdimension



UILabel con truncamiento de UIEdgeInsets personalizado en UITableViewCell (3)

Establezca estas dos propiedades de UILable desde la sección del inspector de Atributos del guión gráfico

  1. Líneas a 0
  2. Salto de línea para ajustar la palabra

o también puede establecer estas propiedades desde el código.

self.answerLabel.numberOfLines = 0 self.answerLabel.lineBreakMode = .byWordWrapping

y ponga debajo el código en la subclase de UILable

class CustomLabel: UILabel { @IBInspectable var topInset: CGFloat = 5.0 @IBInspectable var bottomInset: CGFloat = 5.0 @IBInspectable var leftInset: CGFloat = 20.0 @IBInspectable var rightInset: CGFloat = 5.0 override func drawText(in rect: CGRect) { let insets = UIEdgeInsets(top: topInset, left: leftInset, bottom: bottomInset, right: rightInset) super.drawText(in: UIEdgeInsetsInsetRect(rect, insets)) } override var intrinsicContentSize: CGSize { get { var contentSize = super.intrinsicContentSize contentSize.height += topInset + bottomInset contentSize.width += leftInset + rightInset return contentSize } }

}

prueba esto.

Espero que funcione para ti ..

Tengo un UITableView con celdas que contiene un UILabel. UILabel tiene un UIEdgeInset personalizado. Subclassed el UILabel y establecí los UIEdgeInsets así:

override func drawText(in rect: CGRect) { super.drawText(in: UIEdgeInsetsInsetRect(rect, insets)) } override var intrinsicContentSize: CGSize { var contentSize = super.intrinsicContentSize contentSize.width += leftInset + rightInset contentSize.height += topInset + bottomInset return contentSize }

Pero la etiqueta se trunca algunas veces cuando tengo más líneas en UILabel. Ya configuré la altura de la fila en UITableViewAutomaticDimension y establecí el estimadoRowHeight . También las restricciones están bien. El problema parece ser cuando estoy configurando UIEdgeInsets, ya que funciona bien si no lo personalizo.

Probablemente debería decirle a la célula que actualice las restricciones después de configurar las inserciones, pero no pude hacerlo hasta ahora.

Las restricciones fueron agregadas en el guión gráfico. Bottom , Top , Adelante y Atrás están relacionados con la supervista (UITableViewCell). Todas las constantes configuradas en 0.

En cellForRowAtIndexPath el código es el siguiente:

let cell = tableView.dequeueReusableCell(withIdentifier: "AnswersCell", for: indexPath) as! AnswerCell cell.answerLabel.text = alternatives[indexPath.row] return cell


Subclasé mi etiqueta así:

class PaddingLabel: UILabel { var topInset: CGFloat = 0 var bottomInset: CGFloat = 0 var leftInset: CGFloat = 0 var rightInset: CGFloat = 0 override func drawText(in rect: CGRect) { let insets = UIEdgeInsets(top: topInset, left: leftInset, bottom: bottomInset, right: rightInset) super.drawText(in: UIEdgeInsetsInsetRect(rect, insets)) } override var intrinsicContentSize: CGSize { get { var contentSize = super.intrinsicContentSize contentSize.height += topInset + bottomInset contentSize.width += leftInset + rightInset return contentSize } } }

Tal vez es el get que falta.


Durante el diseño automático de una etiqueta multilínea, UILabel no calcula su altura utilizando el ancho proporcionado por su propiedad intrinsicContentSize , sino que utiliza preferredMaxLayoutWidth , que no se ha ajustado para tener en cuenta sus inserciones de contenido.

El archivo de encabezado para UILabel proporciona el siguiente comentario para preferredMaxLayoutWidth :

// Si no es nulo, esto se usa al determinar -intrinsicContentSize para etiquetas de líneas múltiples

En su caso, el valor deseado para preferredMaxLayoutWidth es el ancho de diseño automático de la etiqueta (es decir, el ancho de la celda de la vista de tabla) menos cualquier inserción de contenido izquierda y derecha. La forma más práctica de establecer esa propiedad es en su subclase de celda de vista de tabla, porque ese es el lugar más sencillo para acceder al ancho de la celda de la vista de tabla durante el diseño automático.

Al realizar el diseño automático para las celdas de vista de tabla de tamaño propio, UITableView llama a systemLayoutSizeFitting systemLayoutSizeFitting(_:withHorizontalFittingPriority:verticalFittingPriority) en cada celda. (Consulte la sesión 226 de WWDC 2014 ). El tamaño de ajuste que se transfiere a ese método es el ancho de la vista de tabla con una altura cero, y la prioridad de ajuste horizontal es UILayoutPriorityRequired .

Por lo tanto, anule ese método y establezca el valor deseado para preferredMaxLayoutWidth :

// AnswerCell.swift @IBOutlet weak var answerLabel: AnswerLabel! override func systemLayoutSizeFitting(_ targetSize: CGSize, withHorizontalFittingPriority horizontalFittingPriority: UILayoutPriority, verticalFittingPriority: UILayoutPriority) -> CGSize { answerLabel.preferredMaxLayoutWidth = targetSize.width - answerLabel.insets.left - answerLabel.insets.right return super.systemLayoutSizeFitting(targetSize, withHorizontalFittingPriority: horizontalFittingPriority, verticalFittingPriority: verticalFittingPriority) }

El efecto es que, al calcular su altura durante el diseño automático, UILabel utiliza un valor de preferredMaxLayoutWidth que se ha ajustado para sus inserciones de contenido, lo que garantiza que UITableView reciba las alturas correctas para sus celdas.

Apéndice

Alternativamente, en lugar de todo lo anterior, puede simplemente cambiar las restricciones en su etiqueta para insertar toda la etiqueta, ya sea directamente en la vista de contenido de la celda de la vista de tabla o incrustándola en otra subvista de la vista de contenido.