Aumente la altura de la fila de la tabla principal de acuerdo con la celda personalizada

Estoy teniendo una aplicación en la que tengo una Tableview y en cada fila de esa tabla estoy creando dinámicamente una celda de vista de tabla personalizada.

A continuación está el código para eso.

NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"flowviewTableViewCell" owner:self options:nil]; cell2 = [nib objectAtIndex:0]; return cell2; 

"FlowTableViewCell" es una UITableViewCell. En esta celda personalizada, tengo una vista de tabla.

Estoy mostrando algunos datos en mi celda de table personalizada de una matriz y esos datos varían en longitud. No se arregla

Soy capaz de boost el tamaño de celda personalizado, pero no la altura de la fila de la tabla principal, dependiendo del tamaño de la celda de tabla vista personalizada.

Deseo boost la altura del tamaño de celda de la tabla principal dinámicamente dependiendo del tamaño de la celda personalizada de la celda de table.

Con el siguiente código, la altura de la celda tableView personalizada está aumentando.

 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { NSString *str = [arrComments objectAtIndex:indexPath.row]; CGSize size = [str sizeWithFont:[UIFont fontWithName:@"Helvetica" size:14] constrainedToSize:CGSizeMake(280, 999) lineBreakMode:NSLineBreakByWordWrapping]; NSLog(@"%f",size.height); if (size.height<20) { size.height=20; //m= size.height; } NSLog(@"%f",size.height); return size.height + 30; } 

¿Cómo puedo ajustar la altura de la altura de la fila de la table principal según el tamaño de la celda de table personalizada?

Aquí, adjunto algunas de las capturas de pantalla para una comprensión clara.

La siguiente es mi TablaViewCell personalizada:

Custom TableViewCell

Lo siguiente es mi tabla principal:

Main TableView

La siguiente es la salida que recibo en este momento:

salida ahora mismo

Puedes ver en la image anterior que el comentario2 se corta y que el comentario de la misma publicación se muestra en la siguiente publicación.

Quiero salida como la siguiente image.

introduzca la descripción de la imagen aquí

Entonces, mi pregunta es ¿cómo puedo boost la altura del tamaño de celda de la tabla principal dinámicamente dependiendo del tamaño de la celda de tabla vista personalizada?

Por favor ayúdenme. Se agradecerá cualquier ayuda.

Puede usar el siguiente código para ajustar la altura dinámicamente. Primero debe determinar la altura de la label y luego ajustar la altura de la celda en consecuencia. He estado usando este código en mi aplicación de chat y funciona bien.

Primero, cree la label y la vista de la image en cellForRowAtIndexPath:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { /// Set Text Label UILabel *lbl_myText = [[UILabel alloc]initWithFrame:CGRectZero]; [lbl_myText setLineBreakMode:NSLineBreakByWordWrapping]; lbl_myText.minimumScaleFactor = FONT_SIZE; [lbl_myText setNumberOfLines:0]; lbl_myText.textAlignment = NSTextAlignmentLeft; [lbl_myText setFont:[UIFont systemFontOfSize:FONT_SIZE]]; NSString *text = [arr_text objectAtIndex:indexPath.row]; CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE]]; // Checks if text is multi-line if (size.width > lbl_myText.bounds.size.width) { CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f); //// Here Width = Width you want to define for the label in its frame. The height of the label will be adjusted according to this. //CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:NSLineBreakByWordWrapping]; NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init]; paragraphStyle.lineBreakMode = NSLineBreakByWordWrapping; CGRect textRect = [text boundingRectWithSize:constraint options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:FONT_SIZE], NSParagraphStyleAttributeName: paragraphStyle.copy} context:nil]; CGSize size = textRect.size; [lbl_myText setText:text]; [lbl_myText setFrame:CGRectMake(cell.imgv_someoneImage.frame.size.width+8, CELL_CONTENT_MARGIN, CELL_CONTENT_WIDTH - cell.imgv_someoneImage.frame.size.width -(CELL_CONTENT_MARGIN * 2), MAX(size.height, 44.0f))]; } else { lbl_myText.frame = CGRectMake(10, 0, cell.frame.size.width - cell.imgv_someoneImage.frame.size.width - 18,18); lbl_myText.textAlignment = NSTextAlignmentLeft; [lbl_myText setText:text]; } //lbl_myText.backgroundColor = [UIColor greenColor]; [cell.contentView addSubview:lbl_myText]; /// Set Date Label NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter setDateFormat:@"yyyy-MM-dd HH:mm"]; NSString *stringFromDate = [formatter stringFromDate:[arr_date objectAtIndex:indexPath.row]]; UILabel *lbl_myDate = [[UILabel alloc]initWithFrame:CGRectMake(cell.imgv_someoneImage.frame.size.width+8, lbl_myText.frame.size.height+10, cell.frame.size.width - cell.imgv_someoneImage.frame.size.width - 10 ,18)]; lbl_myDate.text = stringFromDate; lbl_myDate.font = [UIFont fontWithName:@"Helvetica Neue" size:13.0]; lbl_myDate.textColor = [UIColor lightGrayColor]; lbl_myDate.textAlignment = NSTextAlignmentLeft; [cell.contentView addSubview:lbl_myDate]; /// Set User Image UIImageView *imgv_myImage = [[UIImageView alloc]initWithFrame:CGRectMake(0, lbl_myText.frame.origin.y, 63, 63)]; imgv_myImage.image = selectedUserUploadedImage; [cell.contentView addSubview:imgv_myImage]; } 

Aquí defina algunas de las constantes:

 #define FONT_SIZE 15.0f #define CELL_CONTENT_WIDTH 320.0f /// change this according to your screen size. This is just an example #define CELL_CONTENT_MARGIN 10.0f 

Ahora, después de crear las tags, tendrá que determinar la altura de la celda en heightForRowAtIndexPath:

 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { NSString *cellText = [arr_text objectAtIndex:indexPath.row]; NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter setDateFormat:@"yyyy-MM-dd HH:mm"]; NSString *cellDate = [formatter stringFromDate:[arr_date objectAtIndex:indexPath.row]]; // NSString *text = [items objectAtIndex:[indexPath row]]; CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f); //CGSize labelsize = [cellText sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:NSLineBreakByWordWrapping]; NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init]; paragraphStyle.lineBreakMode = NSLineBreakByWordWrapping; ////for message label CGRect textRect = [cellText boundingRectWithSize:constraint options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:FONT_SIZE], NSParagraphStyleAttributeName: paragraphStyle.copy} context:nil]; CGSize labelsize = textRect.size; ////for date label CGRect datetextRect = [cellDate boundingRectWithSize:constraint options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:FONT_SIZE], NSParagraphStyleAttributeName: paragraphStyle.copy} context:nil]; CGSize datelabelsize = datetextRect.size; //CGSize datelabelsize = [cellDate sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:NSLineBreakByWordWrapping]; ///combine the height CGFloat height = MAX(labelsize.height + datelabelsize.height, 64.0f); if(height == 64.0f) { return 74; /// label is of one line, return original/ static height of the cell } else { return height + 10; /// label is of multi-line, return calculated height of the cell + some buffer height } } 

Puede calcular la altura de la label usando:

 - (CGRect)heightOfLabel:(UILabel*)resizableLable { CGSize constrainedSize = CGSizeMake(resizableLable.frame.size.width , 9999); NSDictionary *attributesDictionary = [NSDictionary dictionaryWithObjectsAndKeys: [UIFont fontWithName:@"HelveticaNeue" size:11.0], NSFontAttributeName, nil]; NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:@"textToShow" attributes:attributesDictionary]; CGRect requinetworkingHeight = [string boundingRectWithSize:constrainedSize options:NSStringDrawingUsesLineFragmentOrigin context:nil ]; if (requinetworkingHeight.size.width > self.resizableLable.frame.size.width) { requinetworkingHeight = CGRectMake(0,0, self.resizableLable.frame.size.width, requinetworkingHeight.size.height); } return requinetworkingHeight; } 

Llame a este método desde el método delegado de TableView:

 - (CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath { UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; return [self heightOfLabel:cell.textLabel]; } 
 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { NSString *str = [arrComments objectAtIndex:indexPath.row]; UIFont *font = [UIFont fontWithName:@"Helvetica" size:14]; CGRect new = [str boundingRectWithSize:CGSizeMake(280, 999) options:NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName: font} context:nil]; CGSize size= new.size; NSLog(@"%f",size.height); if (size.height<20) { size.height=20; //m= size.height; } NSLog(@"%f",size.height); return size.height + 30; } 

Aquí vamos:

  1. Cree una subclass común UITableViewCell para todas las celdas en su vista (como FlowViewAbstractTableViewCell )
  2. Cree un método de class en la subclass de celda de vista de tabla como + (CGFloat)sizeForCellWithComment:(Comment *)comment . Lo que está haciendo es configurar un método para pasar un object model en el que cada subclass de celda de vista de tabla pueda implementar.
  3. Cree sin embargo muchas otras subclasss de celda que necesite henetworkingar de FlowViewAbstractTableViewCell . En su caso, parece que podría tener los llamados FlowViewTextCommentTableViewCell y FlowViewPictureCommentTableViewCell .
  4. Para cada una de esas subclasss, implemente ese método +sizeForCellWithComment: . Esto le permitirá devolver un tamaño de variable en function del object que pase al método.
  5. Implementar - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath para su UITableViewDelegate . En este método, descubrirá qué class de celda desea usar y qué object debe pasar a ese método de tamaño. Por ejemplo:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { Comment *commentForCell = [self.comments objectAtIndex:indexPath.row]; return [CommentTableViewCell sizeForComment:commentForCell].height; }

Esto le permitirá devolver una altura de celda variable basada en el object. Uso celdas de vista de tabla de tamaño variable todo el time y amo este patrón porque creo que hace el mejor trabajo de ocultar la implementación y seguir a MVC.

Este video ofrece un excelente tutorial sobre el uso de la reproducción automática para dimensionar dinámicamente UITableViewCells. Cuando necesitaba hacer esto para una aplicación terminé subclassando UITableViewCell y estableciendo mis restricciones mediante progtwigción, y funcionó como un encanto.

Solución muy simple que el anterior

Prueba esto

 -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return [self.tableName.dataSource tableView:self.tableName cellForRowAtIndexPath:indexPath].contentView.frame.size.height; } 

Y en su delegado cellForRowAtIndexPath si está utilizando la label, primero establezca el número de líneas para labelr como 0, luego establezca el text de la label y luego agregue la propiedad sizeTofit del mismo. Me gusta esto

  [cell.yourLabelName setNumberOfLines:0]; cell.yourLabelName.text = @"Your long or short text"; [cell.yourLabelName sizeToFit]; 

Esto ampliará la altura de su label según el text que contiene.

Después de eso, puede establecer el tamaño del contenido de su celda Ver así.

  cell.contentView.frame = CGRectMake(cell.contentView.frame.origin.x, cell.contentView.frame.origin.y, cell.contentView.frame.size.width,"Height of label" + cell.contentView.frame.size.height);