ios - No se puede cambiar el fotograma de un UILabel en una UITableViewCell cuando aparece por primera vez(usando el diseño automático)
objective-c autolayout (9)
Después de recuperar todos los datos del servidor, puede obtener la altura de ese UILabel
utilizando este método.
CGSize maximumSize = CGSizeMake(210, 9999);
for (int i = 0; i < [_arrProductList count]; i++) {
float row_height = 0.0f;
ProductInformation *product_obj = [_arrProductList objectAtIndex:i];
CGSize desc_size = [self measureHeightForText:product_obj.product_desc forFont: [UIFont systemFontOfSize:14] forSize:maximumSize];
row_height = row_height + desc_size.height;
// [_arrRowHeights addObject:[NSString stringWithFormat:@"%f", row_height]]; You can take it into array.
}
[tableView reloadData];
Y aquí he dado la descripción de measureHeightForText:
Esta lógica funciona en todos los iOS5
, iOS6
, iOS7
.
-(CGSize)measureHeightForText:(NSString *)strText forFont:(UIFont *)font forSize:(CGSize)size{
if (!testingLabel) {
testingLabel = [[UILabel alloc] init];
// testingLabel.font = [UIFont fontWithName:[AppHandlers zHandler].fontName size:16];
testingLabel.text = @"";
testingLabel.numberOfLines = 0;
}
testingLabel.text =strText;
testingLabel.font = font;
CGSize expectedSize = [testingLabel sizeThatFits:size];
return expectedSize;
}
Y luego actualice el tamaño de su etiqueta de acuerdo con esto. Esto está funcionando bien para mí. Lo estoy usando.
Tengo una celda prototipo dentro de mi UITableView
que contiene un UILabel
. Quiero cambiar dinámicamente el tamaño de la etiqueta (y la celda) dependiendo del tamaño del texto en la etiqueta.
Creo el celular prototipo en cellForRowAtIndexPath
siguiente manera:
static NSString *CellIdentifier = @"ProgramDetailCell";
ProgramDetailCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
cell.descriptionLabel.text = self.program.subtitle;
return cell;
Entonces mi ProgramDetailCell
tiene la siguiente implementación:
@implementation ProgramDetailCell
- (void)layoutSubviews {
[super layoutSubviews];
[self.descriptionLabel sizeToFit];
}
@end
La primera vez que se muestra la celda, se llama a layoutSubviews
, pero la descriptionLabel
no obtiene el tamaño. Sin embargo, si me desplazo hacia abajo de la tabla y vuelvo a hacer la copia de seguridad, ¡la celda "reutilizada" aparece con la etiqueta correctamente ajustada!
¿Por qué no funciona la primera vez que se muestra la celda y qué debo hacer para solucionarlo?
¡Gracias por adelantado!
Llama esto en heightForRowAtIndexPath
y calcula manualmente la altura
static NSString *CellIdentifier = @"ProgramDetailCell";
ProgramDetailCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
cell.descriptionLabel.text = self.program.subtitle;
[cell.descriptionLabel sizeToFit];
return cell.descriptionLabel.frame.size.height+cell.descriptionLabel.frame.origin.y;
Porque cuando se llama a layoutSubviews
tu descriptionLabel
texto de la layoutSubviews
aún no está establecido. Y cuando te desplazas, el texto está configurado. Entonces es correcto ahora.
Sugiero que llame a sizeToFit
después de configurar el texto.
static NSString *CellIdentifier = @"ProgramDetailCell";
ProgramDetailCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
cell.descriptionLabel.text = self.program.subtitle;
[cell.descriptionLabel sizeToFit];
return cell;
Puedes usar el siguiente código:
//Calculate the expected size based on the font and linebreak mode of your label
// FLT_MAX here simply means no constraint in height
CGSize maximumLabelSize = CGSizeMake(296, FLT_MAX);
CGSize expectedLabelSize = [yourString sizeWithFont:yourLabel.font constrainedToSize:maximumLabelSize lineBreakMode:yourLabel.lineBreakMode];
//adjust the label the the new height.
CGRect newFrame = yourLabel.frame;
newFrame.size.height = expectedLabelSize.height;
yourLabel.frame = newFrame;
Use el código a continuación para la altura dinámica establecida en la celda
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *messagetext=[NSString stringWithFormat:@"%@",[[arryStoryView objectAtIndex:indexPath.row] valueForKey:@"messagetext"]];
CGSize StoryTextSize= [messagetext sizeWithFont:[UIFont fontWithName:@"Georgia" size:17.0f] constrainedToSize:CGSizeMake(300, MAXFLOAT) lineBreakMode:NSLineBreakByWordWrapping];
int TotalHeight;
TotalHeight= StoryTextSize.height + 10;
return TotalHeight;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell1";
UITableViewCell *cell=[tblSendMsg dequeueReusableCellWithIdentifier:CellIdentifier];
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:CellIdentifier];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
NSString *storytext=[NSString stringWithFormat:@"%@",[[arryStoryView objectAtIndex:indexPath.row] valueForKey:@"storytext"]];
CGSize StoryTextSize = [storytext sizeWithFont:[UIFont fontWithName:@"Georgia" size:17.0f] constrainedToSize:CGSizeMake(300, MAXFLOAT) lineBreakMode:NSLineBreakByWordWrapping];
lblStoryText.frame=CGRectMake(5, 25, [[UIScreen mainScreen] bounds].size.width-10, StoryTextSize.height+30);
int nooflines=StoryTextSize.height/16;
int i= StoryTextSize.height;
if(i%16 !=0)
{
nooflines=nooflines+1;
}
lblStoryText.numberOfLines=nooflines;
lblStoryText.font=[UIFont fontWithName:@"Georgia" size:17.0f];
lblStoryText.text=[NSString stringWithFormat:@"%@",storytext];
return cell;
}
En xib, vaya a la primera pestaña, debajo del Documento del Constructor de Interfaces, desactive la casilla Usar Diseño Automático.
No funciona porque estás usando el auto layout
. Necesitas alguna forma de auto layout
para lograr esto.
Aquí está la solución.
Paso 1 :
Haga que UILabel
fijada en la parte superior e inferior de la UITableViewCell
. Puede lograr esto a través del Interface Builder
al tener Vertical Constraint
en UILabel
desde la top
e bottom
de la celda. Esto hará que el UILabel
aumente de altura si la altura de la celda aumenta o viceversa.
Paso 2:
En su UIViewController en - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
método - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
calcula el tamaño de UITableViewCell
.
Puedes calcularlo usando:
CGRect textFrame = [YourText boundingRectWithSize:CGSizeMake(width of the label, FLT_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:Your Font} context:nil];
ahora devuelve textFrame.size.height
+ padding si está presente.
Paso 3 :
Conseguirá lo que quería: "cambiar dinámicamente el tamaño de la etiqueta (y la celda) según el tamaño del texto en la etiqueta" después de compilar y ejecutar, incluso por primera vez.
Si está utilizando el diseño automático, la modificación del marco no tendrá ningún efecto.
En cambio, debe modificar las restricciones.
Si su requisito es cambiar dinámicamente la altura de la etiqueta, siga el enlace a continuación. Cuando necesitemos cambiar la altura de la etiqueta, necesitamos cambiar la altura de la fila también: