在tableview中使用UILabel的单元格的dynamic高度

我正在开发一个聊天应用程序,它显示用户的消息和图像。 我有一个表格视图和一个自定义单元格。单元格有一个UIlabel和UIImage。 我尝试了各种方法来根据标签的内容文本dynamic调整单元格高度。我已经在故事板本身中设置了numberofLines = 0 ,并将单元格的高度设置为一个常量,以便多行可以适合。但是它不显示多个线和高度我用汽车维度,但它没有工作。 我也使用了下面的链接我正在使用一个types为messageTableViewCell的自定义单元格,其中有一个标签属性。

这里是快照: – 图片

我在viewcontroller.m中的代码

- (void)viewDidLoad { self.tableView.estimatedRowHeight = 100.0; self.tableView.rowHeight = UITableViewAutomaticDimension; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { messageTableViewCell *cell = [self.messageTableView dequeueReusableCellWithIdentifier:@"cell"]; if (cell == nil) { cell = [[messageTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"]; } cell.messageLabel.text = [_messages objectAtIndex:indexPath.row]; cell.messageLabel.lineBreakMode = NSLineBreakByWordWrapping; cell.messageLabel.numberOfLines=0; [cell.messageLabel sizeToFit]; return cell; } 

编辑

而不是标签,我在单元格中插入了一个textview,并将其修改为:

 - (void)textViewDidChange:(UITextView *)textView { CGFloat fixedWidth = textView.frame.size.width; CGSize newSize = [textView sizeThatFits:CGSizeMake(fixedWidth, MAXFLOAT)]; CGRect newFrame = textView.frame; newFrame.size = CGSizeMake(fmaxf(newSize.width, fixedWidth), newSize.height); textView.frame = newFrame; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath: (NSIndexPath *)indexPath { static messageTableViewCell *sizingCell = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ sizingCell = [self.messageTableView dequeueReusableCellWithIdentifier:@"cell"]; }); sizingCell.textMessage.text=_messages[indexPath.row]; CGFloat fixedWidth = sizingCell.textMessage.frame.size.width; CGSize newSize = [sizingCell.textMessage sizeThatFits:CGSizeMake(fixedWidth, MAXFLOAT)]; CGRect newFrame = sizingCell.textMessage.frame; newFrame.size = CGSizeMake(fmaxf(newSize.width, fixedWidth), newSize.height); CGFloat height= newFrame.size.height; NSLog(@"%f is height ",height); return height+5.0f; } 

但它也不起作用,它切断了文本的上半部分。

http://www.raywenderlich.com/73602/dynamic-table-view-cell-height-auto-layout

这可能是我遇到过的最好的教程之一。 它逐步解释了一切,所以你可以适应你的需要。

如果你正在iOS 8以上工作,试试这个。它适用于我。

 cell.messageLabel.text = [_messages objectAtIndex:indexPath.row]; cell.messageLabel.lineBreakMode = NSLineBreakByTruncatingTail; cell.messageLabel.numberOfLines=0; return cell; - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return UITableViewAutomaticDimension; } - (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath { return 10.0; } 

尝试这个:

 - (float)getMessageSize:(NSString *)text Width:(float)textWidth { NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:text attributes:@{ NSFontAttributeName: [UIFont fontWithName:fontNameRefrig size:19.0] }]; CGRect rect = [attributedText boundingRectWithSize:(CGSize){textWidth, CGFLOAT_MAX} options:NSStringDrawingUsesLineFragmentOrigin context:nil]; CGSize finalSize = rect.size; return finalSize.height; } 

试试这个代码

  - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return [customcell getCellHeightForText:@"text"]; } - ( UITableViewCell* ) tableView : ( UITableView* ) tableView cellForRowAtIndexPath : ( NSIndexPath* ) indexPath { cell = [ tableView dequeueReusableCellWithIdentifier : @"customCell" ] ; CGRect rect=cell.frame; rect.size.height = [customcell getCellHeightForText:@"text"]; cell.frame=rect; return cell; } 

在customcell.m文件上

  +(NSInteger) getCellHeightForText:(NSString *) text { float totalHeight = 0; float topMargin = 35; float bottomMargin = 30; CGSize textSize = [text calculateSize:12.0 maxWidth:195 maxHeight:0 lineBreakMode:NSLineBreakByWordWrapping]; totalHeight = totalHeight + textSize.height + topMargin + bottomMargin; return totalHeight; }