ios-根据Tex量更改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;
}

这没有用,它显示了单元格上的整个字符串,但是单元格的高度根本不受影响。

Josh Kahane asked 2019-11-08T17:47:40Z
9个解决方案
80 votes

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

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

它会自动计算行高,然后返回浮点数... :-)

希望这可以帮助!

stepik21 answered 2019-11-08T17:48:54Z
56 votes

嗨乔什,

使用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开始,如果您设置了适当的自动布局约束以进行标记,则只需设置以下委托方法即可实现此目的。

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

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

AJPatel answered 2019-11-08T17:49:58Z
44 votes

estimateRowHeight中:请记住为tableView.rowHeight添加约束顶部和底部

对于调整UILabel高度取决于文本,只需将estimateRowHeight行更改为0   (在这里查看答案)

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

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

这是我的自定义单元格
enter image description here这是我的estimateRowHeight约束
enter image description here
您将获得的屏幕

enter image description here

===建议===
如果您的单元中有一些estimateRowHeighttableView.rowHeight(与我的示例不同),则:

  • 您应该将所有estimateRowHeighttableView.rowHeight放到一个Images(查看)
  • 为此tableView.rowHeight添加estimateRowHeight(就像我图像中的UILabel一样)
  • 像上面我的建议一样调整UILabel的高度
  • 根据内容调整estimateRowHeight的高度(内容均为tableView.rowHeightImages
  • 最后,像上面的代码一样更改estimateRowHeighttableView.rowHeight

希望有帮助

Phan Van Linh answered 2019-11-08T17:51:50Z
21 votes

根据您提供的代码,我认为您只是在增加单元格的高度,而不是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;
}

希望这可以帮助!

更新:这是一个很旧的答案,此答案中的许多行可能已被弃用。

Nitin Alabur answered 2019-11-08T17:48:22Z
7 votes

对于迅速的开发人员:

自定义单元:首先,您可以像下面这样计算文本的高度:

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
    }

此功能不适用于自定义单元格。

希望它能工作。

mumu answered 2019-11-08T17:52:53Z
2 votes

tableView:heightForRowAtIndexPath:中,您可以获取文本并使用sizeWithFont:constrainedToSize:以获取文本的大小。

然后只需返回高度加上缓冲区的一些额外间距即可。

Kevin Low answered 2019-11-08T17:53:24Z
1 votes

您可以全局编写一个方法来使其可以在整个应用程序中使用。 您需要根据需要传递文本,字体和宽度。

在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;
}
Harry P answered 2019-11-08T17:53:56Z
0 votes

我能够使用自动布局来完成此任务。 确保标签贴紧单元格的顶部和底部(我使用的是原型单元格),并且其线设置为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;
VaporwareWolf answered 2019-11-08T17:54:24Z
0 votes
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;


}
HIMANSHU VARSHNEY answered 2019-11-08T17:54:43Z
translate from https://stackoverflow.com:/questions/9827126/change-the-uitableviewcell-height-according-to-amount-of-text