根据文本量更改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议 ===
如果你的单元格有一些UILabels
和Images
(不像我的例子),那么:
- 你应该把所有的
UILabels
和Images
放到一个GroupView
(View) - 将
constraint top and bottom to supper view
添加到此GroupView
constraint top and bottom to supper view
(如我的图像中的UILabel) - 调整UILabel的高度,就像我上面的build议
- 调整
GroupView
高度取决于内容(内容全是UILabels
和Images
) - 最后,像上面的代码一样更改
estimateRowHeight
和tableView.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; }