ios objective-c uitableview autolayout layoutsubviews

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:

Cambiar el tamaño de UILabel no funciona