我需要能够在UITableView中调整单个单元格的高度,以使其符合其详细标签中的文本数量。
我玩了以下但是它对我不起作用:
How do I wrap text in a UITableViewCell without a custom cell
希望你能提供帮助,谢谢。
编辑:
尝试过的代码:
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;
}
这没有用,它显示了单元格上的整个字符串,但单元格高度根本不受影响。
答案 0 :(得分:80)
简单,只需将其添加到您的代码中:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return UITableViewAutomaticDimension;
}
它自动计算行的高度,然后返回浮点数...: - )
希望这有帮助!
答案 1 :(得分:56)
嗨Josh,
使用tableView:heightForRowAtIndexPath:
,您可以在运行时给出每行的大小。现在你的问题是如何从你的字符串中获取高度,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;
如果您使用某个自定义单元格,则使用此处理所有标签的字符串并获取所有高度的总和,然后设置单元格的高度。
修改: iOS 8以后如果你设置了正确的autolayout约束标签,那么你必须只设置以下的委托方法来实现这一点。
-(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;
}
就是这样。无需任何计算。有关详细信息,请查看此tutorial.
答案 2 :(得分:44)
在CustomCell
中:请务必为UILabel
对于调整UILabel高度取决于文本,只需将UILabel
行更改为0
(see the answer here)
然后在你的代码中,只设置2行
self.tableView.estimatedRowHeight = 80;
self.tableView.rowHeight = UITableViewAutomaticDimension;
这是我的自定义单元格
这是我的UILabel
约束
你将实现的屏幕
=== 建议 ===
IF 您的手机有一些UILabels
和Images
(不像我的例子)那么:
UILabels
和Images
放到一个GroupView
(查看)constraint top and bottom to supper view
添加GroupView
(与我图片中的UILabel一样)GroupView
高度取决于内容(内容全部为UILabels
和Images
)estimateRowHeight
和tableView.rowHeight
希望这个帮助
答案 3 :(得分:21)
根据您提供的代码,我认为您只增加了单元格高度而不是cell.textLabel的高度。
理想情况下,您应该设置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;
}
希望这有帮助!
更新:这是一个很老的答案,这个答案中的许多行可能已被弃用。
答案 4 :(得分:5)
对于 swift 开发者:
自定义单元格: 首先,您可以计算文本的高度,如下所示:
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
}
此功能不适用于自定义单元格。
希望它会奏效。
答案 5 :(得分:2)
在tableView:heightForRowAtIndexPath:
中,您可以获取文字并使用sizeWithFont:constrainedToSize:
来获取文字的大小。
然后只返回高度加上缓冲区的额外间距。
答案 6 :(得分:1)
您可以全局编写一个方法,以便在整个应用程序中使用它。您需要根据您的要求传递文本,字体和宽度。
在Swift 4中:
func heightForText(text: String,Font: UIFont,Width: CGFloat) -> CGFloat{
let constrainedSize = CGSize.init(width:Width, height: CGFloat(MAXFLOAT))
let attributesDictionary = NSDictionary.init(object: Font, forKey:NSAttributedStringKey.font as NSCopying)
let mutablestring = NSAttributedString.init(string: text, attributes: attributesDictionary as? [NSAttributedStringKey : Any])
var requiredHeight = mutablestring.boundingRect(with:constrainedSize, options: NSStringDrawingOptions.usesFontLeading.union(NSStringDrawingOptions.usesLineFragmentOrigin), context: nil)
if requiredHeight.size.width > Width {
requiredHeight = CGRect.init(x: 0, y: 0, width: Width, height: requiredHeight.height)
}
return requiredHeight.size.height;
}
答案 7 :(得分:0)
我能够使用autolayout完成这项工作。确保你的标签卡在单元格的顶部和底部(我使用原型单元格),并将它的行设置为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;
答案 8 :(得分:0)
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;
}