如何根据自定义单元格内的 UILabel 设置单元格高度

Posted

技术标签:

【中文标题】如何根据自定义单元格内的 UILabel 设置单元格高度【英文标题】:How to set cell height based on UILabel inside custom cell 【发布时间】:2014-07-21 13:50:41 【问题描述】:

我使用UITableView 来显示数据库中的项目,并且我创建了自定义UITableViewCell,它有一些标签。我最大的标签是名称描述。 每个单元格可以有不同的高度,但我不知道如何设置动态单元格高度。 我得到的只是标签末尾的三个点,单元格的高度始终约为 50。 如何根据其中的标签制作单元格高度?

#define FONT_SIZE 14.0f
#define CELL_CONTENT_WIDTH 320.0f
#define CELL_CONTENT_MARGIN 10.0f

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 

    NSString *text = _orderProperty.Description;

    CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f);

    CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE]
                   constrainedToSize:constraint
                       lineBreakMode:NSLineBreakByWordWrapping];

    CGFloat height = MAX(size.height, 44.0f);

    return height + (CELL_CONTENT_MARGIN * 2);

更新

static NSString *CellIdentifier = @"orderDetailCell";

    OrderDetailCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if(cell == nil)
        [tableView registerNib:[UINib nibWithNibName:@"OrderDetailCustomCell" bundle:nil] forCellReuseIdentifier:CellIdentifier];
        cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    

    OrderProperty* item = [_list objectAtIndex:indexPath.row];

    cell.Title.text =  item.Title;

    NSString* _description = item.Description;

    cell.Description.text = _description;

【问题讨论】:

查看此链接用户“2014”回答***.com/questions/17358322/… 【参考方案1】:

你可以试试这样的

- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
    int rowHeight =0.0f;
    NSString *stringToSize=[NSString stringWithFormat:@"%@",longStringValue];
    CGSize size = [stringToSize
                   sizeWithFont:[UIFont systemFontOfSize:15.0f]
                   constrainedToSize:CGSizeMake(300, 6000)
                   lineBreakMode:NSLineBreakByWordWrapping];
    rowHeight = size.height+10;
    return rowHeight;

您可以从用作表格数据源的数组中获取 longStringValue

【讨论】:

【参考方案2】:

您可以在NSString 上使用以下类别,该类别使用NSTextContainerNSTextContainer 来计算文本的精确 大小。

NSString+Calculation.m

你的最终代码将是这样的:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 

    NSString *text = _orderProperty.Description;

    CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f);

    CGSize size = [text usedSizeForMaxWidth:constraint.width 
                                   withFont:[UIFont systemFontOfSize:FONT_SIZE]];

    CGFloat height = MAX(size.height, 44.0f);

    return height + (CELL_CONTENT_MARGIN * 2);

【讨论】:

【参考方案3】:

sizeWithFont 现已弃用,请使用以下方法根据标签内的文字设置出售高度。

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

   OrderProperty* item = [_list objectAtIndex:indexPath.row]; 

    NSString *text = item.Description;

    NSDictionary *stringAttributes = [NSDictionary dictionaryWithObject:[UIFont fontWithName:@"Helvetica" size:13] forKey:NSFontAttributeName];

    CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f);

    CGSize expectedLabelSize = [content boundingRectWithSize: constraint options:NSStringDrawingTruncatesLastVisibleLine|NSStringDrawingUsesLineFragmentOrigin attributes:stringAttributes context:nil].size;

    return expectedLabelSize.height+CELL_CONTENT_MARGIN * 2);

显然,您需要将字符串属性调整为您正在使用的任何内容。这些只是用于计算所需的单元格高度。

【讨论】:

这似乎接近解决方案。当我用表格加载视图时,一些长字符串单元格被截断。但是在向下和向上滚动后,它会固定到正确的高度。为什么会发生这种情况? 你能把你的 cellForRowAtIndexPath: 方法中的内容放上来吗?通常要检索该单元格中的文本,您将获得基于 indexPath 的文本。您的 cellForRow 详细信息可能会帮助我查看是否是这种情况 好的,谢谢。如果您可以添加行 OrderProperty* item = [_list objectAtIndex:index path] - 这将意味着单元格正在为正确的单元格拾取正确的文本。让我知道它现在是否有效。干杯

以上是关于如何根据自定义单元格内的 UILabel 设置单元格高度的主要内容,如果未能解决你的问题,请参考以下文章

滚动后某些表格视图单元格内容消失(swift)

根据 JSON 文件中的内容文本调整带有 UILabel 的自定义单元格的大小

自定义 UICollectionViewCell 中的 UILabel 始终为空,无法更新文本

Excel单元格内容包含指定单元格内容时,如何把“指定单元格2”复制到“单元格1”后面?

当在同一个单元格内单击按钮时,如何在自定义表格视图单元格内隐藏/显示特定视图

如何以编程方式将 UILabel 和 UiImageView 添加到表视图单元格内的 UIView?