根据文本量更改UITableViewCell高度

我需要能够调整我的UITableView中的单个单元格的高度,以适应其详细标签中的文本的数量。

我已经玩了下面,但它不适合我:

如何在没有自定义单元格的情况下在UITableViewCell中包装文本

希望你能帮忙,谢谢。

编辑:

尝试的代码:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; cell.textLabel.lineBreakMode = UILineBreakModeWordWrap; cell.textLabel.numberOfLines = 0; cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:17.0]; } 

 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { NSString *cellText = @"Go get some text for your cell."; UIFont *cellFont = [UIFont fontWithName:@"Helvetica" size:17.0]; CGSize constraintSize = CGSizeMake(280.0f, MAXFLOAT); CGSize labelSize = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap]; return labelSize.height + 20; } 

这没有奏效,它显示了单元格上的整个string,但单元格高度完全不受影响。

基于你提供的代码,我认为你只增加单元格的高度,而不是单元格的高度。

理想情况下,您应该设置cell.textLabel的框架大小和单元格,以便在单元格中看到全文。

一个简单的方法来查看大小的视图有什么问题,就是将其与背景颜色不同(尝试将cell.textLabel背景设置为黄色),然后查看是否实际设置了高度。

这是应该如何

 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; cell.textLabel.lineBreakMode = NSLineBreakByWordWrapping; cell.textLabel.numberOfLines = 0; cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:17.0]; NSString *cellText = @"Go get some text for your cell."; UIFont *cellFont = cell.textLabel.font; CGSize constraintSize = CGSizeMake(280.0f, MAXFLOAT); CGSize labelSize = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap]; cell.textlabel.frame.size = labelSize; cell.text = cellText; } 

希望这可以帮助!

更新:这是一个相当古老的答案,这个答案中的许多行可能会被弃用。

它的简单,只需将其添加到您的代码:

 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return UITableViewAutomaticDimension; } 

它会自动计算行的高度,并返回一个浮点数… 🙂

希望这可以帮助!

嗨乔希,

使用tableView:heightForRowAtIndexPath:你可以在运行时给每行的大小。 现在你的问题是如何从你的string中获取高度NSString类中有函数通过这个代码你的问题,

 -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { NSString *str = [dataSourceArray objectAtIndex:indexPath.row]; CGSize size = [str sizeWithFont:[UIFont fontWithName:@"Helvetica" size:17] constrainedToSize:CGSizeMake(280, 999) lineBreakMode:NSLineBreakByWordWrapping]; NSLog(@"%f",size.height); return size.height + 10; } 

在下面你设置你的标签的数量。 线到最大。 所以在cellForRowAtIndexPath:方法中设置它。

cell.textLabel.numberOfLines = 0;

如果你使用一些自定义单元格,然后用这个pipe理所有标签的string,并获得所有高度的总和,然后设置你的单元格的高度。

编辑:从 iOS 8起,如果你设置适当的自动布局约束标签,那么你必须设置下面的委托方法来实现这一点。

 -(CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath { //minimum size of your cell, it should be single line of label if you are not clear min. then return UITableViewAutomaticDimension; return UITableViewAutomaticDimension; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return UITableViewAutomaticDimension; } 

就是这样。 不需要任何计算。 有关更多信息,请查看本教程。

在您的CustomCell :请记住为您的UILabel添加约束顶部和底部

为了调整UILabel的高度取决于文本,只需将UILabel行更改为0( 请参阅此处的答案)

然后在你的代码中,只设置2行

 self.tableView.estimatedRowHeight = 80; self.tableView.rowHeight = UITableViewAutomaticDimension; 

这是我的自定义单元格
在这里输入图像描述 这是我的UILabel约束
在这里输入图像描述
你将实现的屏幕

在这里输入图像描述

=== build议 ===
如果你的单元格有一些UILabelsImages (不像我的例子),那么:

  • 你应该把所有的UILabelsImages放到一个GroupView (View)
  • constraint top and bottom to supper view添加到此GroupView constraint top and bottom to supper view (如我的图像中的UILabel)
  • 调整UILabel的高度,就像我上面的build议
  • 调整GroupView高度取决于内容(内容全是UILabelsImages
  • 最后,像上面的代码一样更改estimateRowHeighttableView.rowHeight

希望这个帮助

对于快速开发人员:

自定义单元格 :首先,您可以计算文本的高度 ,如下所示:

 func calculateHeight(inString:String) -> CGFloat { let messageString = inString let attributes : [String : Any] = [NSFontAttributeName : UIFont.systemFont(ofSize: 15.0)] let attributedString : NSAttributedString = NSAttributedString(string: messageString, attributes: attributes) let rect : CGRect = attributedString.boundingRect(with: CGSize(width: 222.0, height: CGFloat.greatestFiniteMagnitude), options: .usesLineFragmentOrigin, context: nil) let requredSize:CGRect = rect return requredSize.height } 

设置文本标签宽度

然后调用这个函数:

 func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { heightOfRow = self.calculateHeight(inString: conversations[indexPath.row].description) return (heightOfRow + 60.0) } 

对于基本单元格

 func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return UITableViewAutomaticDimension } 

此function对于自定义单元格不起作用

希望它能工作。

tableView:heightForRowAtIndexPath:你可以取文本并使用sizeWithFont:constrainedToSize:来得到文本的大小。

然后只是返回高度加缓冲区的一些额外的间距。

我能够使用自动布局来完成这个任务。 确保你的标签捕捉到单元格的顶部和底部(我使用的是原型单元格),它的行设置为0.然后在tableView:heightForRowAtIndexPath:sizeWithFont:constrainedToSize:你可以设置单元格的高度对文字大小进行计算:

 NSString *key = self.detailContent.allKeys[indexPath.row]; NSDictionary *dictionary = self.detailContent[key]; NSString *cellText = dictionary[kSMDetailTableViewCellTextKey]; UIFont *cellFont = [UIFont fontWithName:kFontKeyEmondsans size:12.0]; CGSize constraintSize = CGSizeMake(252.0f, MAXFLOAT); CGSize labelSize = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:NSLineBreakByWordWrapping]; return labelSize.height;// + 10; 
 NSString *str; NSArray* dictArr; if (_index==0) { dictArr = mustangCarDetailDictArr[indexPath.section]; } NSDictionary* dict = dictArr[indexPath.row]; if (indexPath.section ==0) { str = [dict valueForKey:@"FeatureName"]; if ([[dict valueForKey:@"FeatureDetail"] isKindOfClass:[NSString class]]) { str = [dict valueForKey:@"FeatureDetail"]; } else { if (dictArr.count>indexPath.row+1) { NSDictionary* dict2 = dictArr[indexPath.row+1]; if ([[dict2 valueForKey:@"FeatureDetail"] isKindOfClass:[NSString class]]) { } } } } CGSize size = [str sizeWithFont:[UIFont fontWithName:@"Helvetica" size:17] constrainedToSize:CGSizeMake(280, 999) lineBreakMode:NSLineBreakByWordWrapping]; NSLog(@"%f",size.height); return size.height + 20; }