Cambie la altura de UITableViewCell de acuerdo con la cantidad de texto

Necesito poder ajustar la altura de una sola celda en mi UITableView para que se ajuste a la cantidad de texto en su etiqueta de detalles.

He jugado con lo siguiente pero no me ha funcionado:

¿Cómo envuelvo el texto en una UITableViewCell sin una celda personalizada?

Espero que puedas ayudar, gracias.

EDITAR:

Código intentado:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; cell.textLabel.lineBreakMode = UILineBreakModeWordWrap; cell.textLabel.numberOfLines = 0; cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:17.0]; } 

y

 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { NSString *cellText = @"Go get some text for your cell."; UIFont *cellFont = [UIFont fontWithName:@"Helvetica" size:17.0]; CGSize constraintSize = CGSizeMake(280.0f, MAXFLOAT); CGSize labelSize = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap]; return labelSize.height + 20; } 

Esto no funcionó, muestra toda la cadena en la celda, sin embargo, la altura de la celda no se ve afectada en absoluto.

Según el código que ha proporcionado, creo que está aumentando solo la altura de la celda y no la altura de la celda de la etiqueta.

Idealmente, debe establecer el tamaño del marco de cell.textLabel y la celda para que pueda ver el texto completo en la celda.

Una manera clara de ver qué está mal con una vista en términos de tamaño, es colorearla de forma diferente al fondo (intente configurar el fondo cell.textLabel en amarillo) y ver si realmente se está configurando la altura.

Así es como debería ser

 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; cell.textLabel.lineBreakMode = NSLineBreakByWordWrapping; cell.textLabel.numberOfLines = 0; cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:17.0]; NSString *cellText = @"Go get some text for your cell."; UIFont *cellFont = cell.textLabel.font; CGSize constraintSize = CGSizeMake(280.0f, MAXFLOAT); CGSize labelSize = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap]; cell.textlabel.frame.size = labelSize; cell.text = cellText; } 

¡Espero que esto ayude!

actualización: esta es una respuesta bastante antigua, y muchas líneas en esta respuesta pueden estar en desuso.

Es simple, solo agrega esto a tu código:

 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return UITableViewAutomaticDimension; } 

Cuenta automáticamente una altura de fila y luego devuelve un flotador … 🙂

¡Espero que esto ayude!

Hola Josh,

Usando tableView:heightForRowAtIndexPath: puede dar el tamaño de cada fila en tiempo de ejecución. ahora su problema es cómo obtener altura de su cadena hay función en la clase NSString por este código su problema,

 -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { NSString *str = [dataSourceArray objectAtIndex:indexPath.row]; CGSize size = [str sizeWithFont:[UIFont fontWithName:@"Helvetica" size:17] constrainedToSize:CGSizeMake(280, 999) lineBreakMode:NSLineBreakByWordWrapping]; NSLog(@"%f",size.height); return size.height + 10; } 

por debajo de la línea, configura el número de su etiqueta. de línea a máx. así que configúralo en cellForRowAtIndexPath: método.

cell.textLabel.numberOfLines = 0;

si usa alguna celda personalizada, administre toda la cadena de tags con esto y obtenga la sum de toda esa altura, luego configure la altura de su celda.

Editar: iOS 8 en adelante si configura restricciones de autolayout adecuadas para etiquetar, entonces tiene que establecer solo el siguiente método de delegado para lograr esto.

 -(CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath { //minimum size of your cell, it should be single line of label if you are not clear min. then return UITableViewAutomaticDimension; return UITableViewAutomaticDimension; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return UITableViewAutomaticDimension; } 

eso es todo. no se requiere ningún cálculo. Para obtener más información, consulte este tutorial.

En su CustomCell : recuerde agregar la restricción superior e inferior para su UILabel

Para ajustar la altura de UILabel depende del texto simplemente cambie la línea de UILabel a 0 ( vea la respuesta aquí)

Luego, en tu código, solo configura 2 líneas

 self.tableView.estimatedRowHeight = 80; self.tableView.rowHeight = UITableViewAutomaticDimension; 

Aquí está mi celda personalizada
enter image description here Aquí están mis restricciones UILabel
enter image description here
La pantalla que logrará

enter image description here

=== Sugerencia ===
SI su celda tiene algunos UILabels e Images (no como mi ejemplo), entonces:

  • Debería poner todos UILabels e Images en un GroupView (Ver)
  • Agregue la constraint top and bottom to supper view para este GroupView (como el UILabel en mi imagen)
  • Ajuste la altura de UILabel como la sugerencia anterior
  • Ajuste la altura de GroupView depende del contenido (el contenido es todo UILabels e Images )
  • Por último, cambie estimateRowHeight y tableView.rowHeight como el código anterior

Espero que esto ayude

Para desarrolladores rápidos :

Celda personalizada : al principio puedes calcular la altura del texto como se muestra a continuación:

 func calculateHeight(inString:String) -> CGFloat { let messageString = inString let attributes : [String : Any] = [NSFontAttributeName : UIFont.systemFont(ofSize: 15.0)] let attributedString : NSAttributedString = NSAttributedString(string: messageString, attributes: attributes) let rect : CGRect = attributedString.boundingRect(with: CGSize(width: 222.0, height: CGFloat.greatestFiniteMagnitude), options: .usesLineFragmentOrigin, context: nil) let requredSize:CGRect = rect return requredSize.height } 

Establezca el ancho de su etiqueta de texto

Luego llama a esta función:

 func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { heightOfRow = self.calculateHeight(inString: conversations[indexPath.row].description) return (heightOfRow + 60.0) } 

Para la celda básica :

 func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return UITableViewAutomaticDimension } 

Esta función no funcionará para las celdas personalizadas .

Espero que funcione

En tableView:heightForRowAtIndexPath: puede tomar el texto y usar sizeWithFont:constrainedToSize: para obtener el tamaño del texto.

Luego solo devuelve la altura más algunos espacios adicionales para el buffer.

Pude lograr esto utilizando el diseño automático. Asegúrese de que su etiqueta encaje en la parte superior e inferior de la celda (estoy usando una celda prototipo), y sus líneas están configuradas en 0. Luego en la tableView:heightForRowAtIndexPath:sizeWithFont:constrainedToSize: puede establecer la altura de la celda haciendo el cálculo en el tamaño del texto:

 NSString *key = self.detailContent.allKeys[indexPath.row]; NSDictionary *dictionary = self.detailContent[key]; NSString *cellText = dictionary[kSMDetailTableViewCellTextKey]; UIFont *cellFont = [UIFont fontWithName:kFontKeyEmondsans size:12.0]; CGSize constraintSize = CGSizeMake(252.0f, MAXFLOAT); CGSize labelSize = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:NSLineBreakByWordWrapping]; return labelSize.height;// + 10; 
 NSString *str; NSArray* dictArr; if (_index==0) { dictArr = mustangCarDetailDictArr[indexPath.section]; } NSDictionary* dict = dictArr[indexPath.row]; if (indexPath.section ==0) { str = [dict valueForKey:@"FeatureName"]; if ([[dict valueForKey:@"FeatureDetail"] isKindOfClass:[NSString class]]) { str = [dict valueForKey:@"FeatureDetail"]; } else { if (dictArr.count>indexPath.row+1) { NSDictionary* dict2 = dictArr[indexPath.row+1]; if ([[dict2 valueForKey:@"FeatureDetail"] isKindOfClass:[NSString class]]) { } } } } CGSize size = [str sizeWithFont:[UIFont fontWithName:@"Helvetica" size:17] constrainedToSize:CGSizeMake(280, 999) lineBreakMode:NSLineBreakByWordWrapping]; NSLog(@"%f",size.height); return size.height + 20; } 

Puede escribir un método de forma global para que pueda usarse en toda la aplicación. Necesita pasar el texto, la fuente y el ancho según su requisito.

En Swift 4:

 func heightForText(text: String,Font: UIFont,Width: CGFloat) -> CGFloat{ let constrainedSize = CGSize.init(width:Width, height: CGFloat(MAXFLOAT)) let attributesDictionary = NSDictionary.init(object: Font, forKey:NSAttributedStringKey.font as NSCopying) let mutablestring = NSAttributedString.init(string: text, attributes: attributesDictionary as? [NSAttributedStringKey : Any]) var requiredHeight = mutablestring.boundingRect(with:constrainedSize, options: NSStringDrawingOptions.usesFontLeading.union(NSStringDrawingOptions.usesLineFragmentOrigin), context: nil) if requiredHeight.size.width > Width { requiredHeight = CGRect.init(x: 0, y: 0, width: Width, height: requiredHeight.height) } return requiredHeight.size.height; }