ios - source - uitableviewcell swift 3
Cambie la altura de UITableViewCell de acuerdo con la cantidad de texto (9)
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.
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.
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
Aquí están mis restricciones UILabel
La pantalla que logrará
=== Sugerencia ===
SI su celda tiene algunos UILabels
e Images
(no como mi ejemplo), entonces:
- Debería poner todos
UILabels
eImages
en unGroupView
(Ver) - Agregue la
constraint top and bottom to supper view
para esteGroupView
(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 todoUILabels
eImages
) - Por último, cambie
estimateRowHeight
ytableView.rowHeight
como el código anterior
Espero que esto ayude
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!
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;
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;
}
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.
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 etiquetas con esto y obtenga la suma 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.
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;
}