Cuando uso Auto Layout para elegir la altura de cada celda (para que sean dynamics), en su mayoría funciona, pero algunas celdas son un poco cortas. ¿Por qué es esto?

Proyecto de ejemplo: http://cl.ly/2j0A1J203f3h

Estoy intentando utilizar el layout automático para determinar dinámicamente la altura de cada celda, de modo que algunas celdas pueden contener más contenido que otras. Para hacer esto, estoy usando esta respuesta de Stackoverflow y el ejemplo de GitHub que lo acompaña .

Tengo una subclass UITableViewCell llamada CSPostCell que creé en el Storyboard y puse un UILabel con un máximo de 5 líneas de text en la label.

Solo por ejemplo, solo tengo dos celdas en la tabla y, como tal, dos trozos de text diferentes para las tags (una más larga) que se configura en cellForRowAtIndexPath: :

 - (CSPostCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { CSPostCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SelfPostCell" forIndexPath:indexPath]; cell.postTitle.text = indexPath.row == 0 ? @"Short title" : @"Long long long title. Holy crap this is one long title. When does it end? Oh right now."; [cell setNeedsUpdateConstraints]; return cell; } 

Luego devuelvo la altura de cada celda como tal:

 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { CSPostCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SelfPostCell"]; cell.postTitle.text = indexPath.row == 0 ? @"Short title" : @"Long long long title. Holy crap this is one long title. When does it end? Oh right now."; cell.postTitle.prefernetworkingMaxLayoutWidth = tableView.bounds.size.width - 40; [cell setNeedsUpdateConstraints]; [cell updateConstraintsIfNeeded]; [cell.contentView setNeedsLayout]; [cell.contentView layoutIfNeeded]; CGFloat height = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height; return height; } 

Cuál es más o less una copy exacta del ejemplo del repository de GitHub .

Sin embargo, cuando ejecuto la aplicación en el simulador, no funciona como debería. Las alturas son dinámicas y se ajustan a trozos de text más largos, pero no lo suficiente como para que el text no se corte. Vea la image a continuación:

introduzca la descripción de la imagen aquí

En ese caso anterior, la label de la segunda celda debería mostrar otra línea para terminar el text, pero se corta.

¿Por qué no muestra todo el text?

Este código simplificado funcionó bien para mí, con solo un ligero chapoteo de 2 puntos. Todas las llamadas a updateConstraints parecen ser innecesarias. No estoy seguro de por qué necesitas el factor fudge, ¿tal vez algún relleno en la label? Lo probé con diferentes cadenas de longitud y diferentes tamaños de fuente, y siempre funcionó correctamente.

 - (CSPostCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { CSPostCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SelfPostCell" forIndexPath:indexPath]; cell.postTitle.text = indexPath.row == 0 ? @"Short title" : @"Long long long title. Holy crap this is one long title. When does it end? Oh right now."; return cell; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { CSPostCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SelfPostCell"]; cell.postTitle.text = indexPath.row == 0 ? @"Short title" : @"Long long long title. Holy crap this is one long title. When does it end? Oh right now."; cell.postTitle.prefernetworkingMaxLayoutWidth = tableView.bounds.size.width - 40; CGFloat height = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height; return height + 2; }