Увеличьте высоту строки основного стола в соответствии с пользовательской ячейкой

У меня есть приложение, в котором у меня есть Tableview, и в каждой строке этого таблицы я динамически создаю пользовательскую ячейку tableview.

Ниже приведен код для этого.

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

«FlowTableViewCell» – это UITableViewCell. В этой пользовательской ячейке у меня есть один вид таблицы.

Я показываю некоторые данные в своей пользовательской ячейке tableview из массива, и эти данные различаются по длине. Он не фиксирован.

Я могу увеличить размер пользовательской ячейки, но не основную высоту строки таблицы в зависимости от размера пользовательской ячейки таблицы.

Я хочу увеличить высоту размера ячейки основного стола динамически в зависимости от размера пользовательской ячейки таблицы.

При использовании следующего кода высота пользовательской ячейки tableView увеличивается.

 - (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; } 

Как настроить высоту строки основного стола в зависимости от размера пользовательской таблицы tableviewcell?

Здесь я прилагаю некоторые скриншоты для четкого понимания.

Следующим является мой пользовательский TableViewCell:

Пользовательский TableViewCell

Следующим является мой основной TableView:

Основной TableView

Ниже приводится вывод, который я получаю прямо сейчас:

выход прямо сейчас

На приведенном выше изображении вы можете видеть, что comment2 получает cut, а comment3 того же сообщения отображается в следующем сообщении.

Я хочу, чтобы результат был следующим следующим образом.

введите описание изображения здесь

Итак, мой вопрос заключается в том, как динамически увеличить высоту размера основного табло viewview в зависимости от размера пользовательской ячейки tableview?

Пожалуйста, помогите мне. Любая помощь будет оценена

Вы можете использовать следующий код для динамического изменения высоты. Сначала вам нужно определить высоту метки и затем соответствующим образом отрегулировать высоту ячейки. Я использую этот код в своем приложении для чата и отлично работает.

Сначала создайте представление метки и изображения в 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]; } 

Здесь определите некоторые из констант:

 #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 

Теперь, создав метки, вам нужно будет определить высоту ячейки в 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 } } 

Вы можете рассчитать высоту метки, используя:

 - (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 requiredHeight = [string boundingRectWithSize:constrainedSize options:NSStringDrawingUsesLineFragmentOrigin context:nil ]; if (requiredHeight.size.width > self.resizableLable.frame.size.width) { requiredHeight = CGRectMake(0,0, self.resizableLable.frame.size.width, requiredHeight.size.height); } return requiredHeight; } 

Вызвать этот метод из метода делегата 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; } 

Вот так:

  1. Создайте общий подкласс UITableViewCell для всех ячеек в вашем представлении (например, FlowViewAbstractTableViewCell )
  2. Создайте метод класса в подклассе ячейки представления таблицы, например + (CGFloat)sizeForCellWithComment:(Comment *)comment . То, что вы делаете, – это настройка метода для передачи объекта модели, в который может реализовываться каждый класс подкласса таблицы.
  3. Создайте, однако, много других подклассов ячеек, которые вам нужны, чтобы наследовать от FlowViewAbstractTableViewCell . В вашем случае похоже, что у вас могут быть те, которые называются FlowViewTextCommentTableViewCell и FlowViewPictureCommentTableViewCell .
  4. Для каждого из этих подклассов реализуем этот метод +sizeForCellWithComment: Это позволит вам вернуть переменный размер на основе объекта, который вы передаете в метод.
  5. Реализация - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath для вашего UITableViewDelegate . В этом методе вы поймете, какой класс ячеек вы хотите использовать и какой объект передать в этот метод размера. Например:

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

Это позволит вам вернуть переменную высоту ячейки на основе объекта. Я все время использую переменные таблицы просмотра таблиц и люблю этот шаблон, потому что я думаю, что он лучше всего скрывает реализацию и после MVC.

Это видео дает отличный учебник по использованию автозапуска для динамического размера UITableViewCells. Когда мне нужно было сделать это для приложения, я закончил подклассификацию UITableViewCell и программным образом установил свои ограничения, и это сработало как шарм.

Очень простое решение, чем выше

Попробуй это

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

И в делегате cellForRowAtIndexPath, если вы используете метку, сначала установите количество строк, которые будут помечены как 0, затем установите текст метки, а затем добавьте свойство sizeTofit. Как это

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

Это расширит высоту вашего ярлыка в соответствии с текстом в нем.

После этого вы можете установить размер вашего содержимого cellView таким образом.

  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); 
Interesting Posts
Давайте будем гением компьютера.