UITableView con UILabel SizeToFit se ensucia cuando se desplaza

Hola a todos tengo problemas con mi vista de tableview , hago Cell con uilabel con SizeToFit y luego calculo la altura de UILabel para establecer la altura de la celda todo funciona bien excepto cuando tableView mi tableView el text se tableView extraño como un char por línea:

El método My TableViewVell es:

 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; } UILabel *label = (UILabel *)[cell viewWithTag:1]; label.text = [someArray objectAtIndex:indexPath.row]; // Set the UILabel to fit my text; messageLabel.lineBreakMode = UILineBreakModeWordWrap; messageLabel.numberOfLines = 0; [messageLabel sizeToFit]; return cell; } 

La altura de la celda permanece en el tamaño correcto El problema solo con la UILabel … este es el resultado cuando carga la vista:

Primera captura de pantalla

Y esto es después de que comienzo a desplazarme por TableView:

Segunda captura de pantalla

¿¿¿Alguna ayuda???

probablemente deberías subclasificar tu celular y limpiar el UILabel en

  override func prepareForReuse() { super.prepareForReuse() self.label.text = nil } 

El método sizeToFit respeta el ancho del marco y ajusta la height . Y la celda de vista de tabla reutiliza las celdas. Combinar esos dos comportamientos puede causar el problema que describiste.

Una de sus tags, que tiene un contenido muy corto (p. Ej., En la cuarta celda con la palabra "jio"), sizeToFit tamaño con sizeToFit y el ancho resultante es menor que el ancho original que deseaba.

Después de eso, la vista de tabla reutiliza la celda y sizeToFit todavía respeta el ancho pequeño calculado a partir de la llamada anterior de sizeToFit .

Soluciones:

1) configure el ancho del marco con el ancho de label original previsto cada vez antes de llamar a sizeToFit :

 CGRect frame = messageLabel.frame; frame.size.width = 100.0; //you need to adjust this value messageLabel.frame = frame; 

2) use su cálculo de altura de fila y configure la altura del marco en su lugar. No es necesario usar sizeToFit .

Si no está utilizando la function autolayout, esto también se puede resolver agregando una categoría en UIView

 public func sizeToFit(constrainedSize: CGSize) -> CGSize { var newSize = sizeThatFits(constrainedSize) newSize.width = min(newSize.width, constrainedSize.width) newSize.height = min(newSize.height, constrainedSize.height) self.size = newSize return newSize } 

La idea es usar sizeThatFits con un tamaño restringido para determinar el tamaño a adoptar y luego usar el mínimo ancho / alto esperado.

Entonces solo tienes que hacer algo como

 yourLabel.sizeToFit(self.contentView.size) // or yourLabel.sizeToFit(CGSize(width: maxWidth, height: self.contentView.size.height))