UILabel multilínea en UITableViewCells autodimensionado con classs de tamaño: iOS 8 y Swift

Estoy teniendo un problema con iOS 8 beta 4 (y también con la versión beta 5), ​​que es la UILabel que no muestra todo el text en UITableViewCells. Utilicé las células autodimensionadas para hacer esto, y un storyboard para todos los dispositivos.

Esto es lo que obtengo en el iPhone:

iphone captura de pantalla

Código: –

ViewController.swift

@IBOutlet var tableView: UITableView! override func viewDidLoad() { super.viewDidLoad() self.tableView.registerClass(TableViewCell.self, forCellReuseIdentifier: "cell") self.tableView.estimatedRowHeight = 200 self.tableView.rowHeight = UITableViewAutomaticDimension } func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! { let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as TableViewCell switch indexPath.row { case 0: cell.label.text = "hello hello hello hellohellohellohellohello hello hello hello hello hello hello hello hellohellohello hellohello hellohellohellohellohello hello hello hello hello hello hello hello hello hello hello hello hello hellohellohello hello hello hello" case 1: cell.label.text = "doesn'twork doesn'tworkdoesn't work doesn'twork doesn'tworkdoesn't work doesn'twork doesn'twork doesn't workdoesn't workdoesn'twork doesn'twork doesn't workdoesn't workdoesn't workdoesn'twork " case 2: cell.label.text = "baims baimsbaimsbaims baimsbaimsbaimsbaims baims baimsbaims baimsbaimsbaimsbaims baimsbaims baims baimsbaimsbaims baimsbaims baims baimsbaimsbaimsbaims baimsbaims baimsbaims baimsbaims" default: cell.label.text = "hello hello hello hellohellohellohellohello hello hello hello hello hello hello hello hellohellohello hellohello hellohellohellohellohello hello hello hello hello hello hello hello hello hello hello hello hello hellohellohello hello hello hello" } cell.setNeedsUpdateConstraints() cell.updateConstraintsIfNeeded() return cell } 

TableViewCell.swift

 var label : UILabel! var didUpdateConstraints = false override init(style: UITableViewCellStyle, reuseIdentifier: String) { self.label = UILabel() self.label.textColor = self.label.tintColor self.label.numberOfLines = 0 self.label.setTranslatesAutoresizingMaskIntoConstraints(false) super.init(style: style, reuseIdentifier: reuseIdentifier) self.contentView.addSubview(self.label) } override func updateConstraints() { if !self.didUpdateConstraints { self.contentView.addConstraint(NSLayoutConstraint(item: self.label, attribute: .Leading, relatedBy: .Equal, toItem: self.contentView, attribute: .Leading, multiplier: 1, constant: 20)) self.contentView.addConstraint(NSLayoutConstraint(item: self.label, attribute: .Trailing, relatedBy: .Equal, toItem: self.contentView, attribute: .Trailing, multiplier: 1, constant: 20)) self.contentView.addConstraint(NSLayoutConstraint(item: self.label, attribute: .Bottom, relatedBy: .Equal, toItem: self.contentView, attribute: .Bottom, multiplier: 1, constant: 10)) self.contentView.addConstraint(NSLayoutConstraint(item: self.label, attribute: .Top, relatedBy: .Equal, toItem: self.contentView, attribute: .Top, multiplier: 1, constant: 13)) self.didUpdateConstraints = true } super.updateConstraints() } 

Y aquí está mi storyboard: guión gráfico

Creo que fue un error en la versión beta 4, pero debería corregirse en la versión beta como dice la nota de la versión:

Se corrigió en la versión beta 5: cuando el ancho de una label multilínea cambia debido a cambios en el layoutMargins de alguna vista, el tamaño de contenido intrínseco de la label no se invalida cuando debería serlo. Como resultado, el layout puede truncar inesperadamente la label (o vista de text). /// Solución: la vista cuyo layoutMargins está cambiando debe anular layoutMarginsDidChange y enviar invalidateIntrinsicContentSize a la label.

Está agregando un gran margen en su vista de tabla a través de restricciones, esta es la distancia al borde. Si establece esta distancia a 8 o Standard , esta distancia desaparecerá. Esto debería resolver el problema con la altura de TableViewCell también, si no, verifique este código:

 func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { let label = // Get the label from the cell here return label.frame.size.height + 16 // Assuming you have 2 constraints on top & bottom, each 8 } 

Debe agregar las siguientes líneas al "TableViewController":

 class TableViewController: UITableViewController override func viewDidLoad() { super.viewDidLoad() self.tableView.estimatedRowHeight = 70 self.tableView.rowHeight = UITableViewAutomaticDimension } ... 

configure la celda textLabel (multiline & wordwrap):

 ... override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! UITableViewCell cell.textLabel?.numberOfLines = 0 cell.textLabel?.lineBreakMode = NSLineBreakMode.ByWordWrapping } ... 

Eliminar la function (ya no es necesaria):

 ... func override tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { } ... 

Eso se ajusta automáticamente a mi celda de vista de tabla de varias líneas.