UITableviewCell 高度自动布局

Posted

技术标签:

【中文标题】UITableviewCell 高度自动布局【英文标题】:UITableviewCell height autolayout 【发布时间】:2014-11-06 05:18:32 【问题描述】:

我有以下 UITableviewCell 布局,我正在使用自动布局来处理这个

========= 
| Image | Name Label
|       | Short description Label
=========
Description Label

这里的描述标签是可选的,它会根据内容隐藏/显示,我正在使用heightForRowAtIndexPath计算单元格的高度

- (CGFloat)heightForTableView:(UITableView *)tableView cell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath

    cell.bounds = CGRectMake(0, 0, CGRectGetWidth(tableView.bounds), CGRectGetHeight(cell.bounds));

    [cell setNeedsLayout];
    [cell layoutIfNeeded];

    CGSize cellSize = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];

    // Add extra padding
    CGFloat height = cellSize.height;// + 1;

    return height;

即使我隐藏了隐藏描述标签,它也会为单元格返回相同的高度,我缺少什么?

谁能建议使用自动布局处理此类场景的最佳方法?

编辑 1:设置空的作品,但有没有更好的方法?

【问题讨论】:

可以显示计算单元格高度的完整代码吗? 你在哪里隐藏标签?在调用此方法之前? 用模型配置时是的 能否请您尝试将一个空字符串设置为 detailLabel 设置空作品但有没有更好的办法? 【参考方案1】:

heightForRowAtIndexPath 也会为所有行调用。因此,对于您隐藏描述标签的行,对于同一行,您可以在 heightForRowAtIndexPath 方法中设置高度。

例如。 对于第 4 行,您想通过检查某些条件来隐藏描述标签。

在 heightForRowAtIndexPath 中,您可以检查同一行的相同条件,并且可以在不显示描述标签的情况下返回所需的高度。

让我们说,

if(description.length==0)
 
    return 100;//  description label hidden
 
else 
 
   return 140;//  description label shown
 

【讨论】:

我更新了计算单元格高度的方法,我只希望它返回精确值 忘记计算单元高度的方法,试试我说的吧。它必须工作 我有很多不同的单元格,所以我不能简单地使用它【参考方案2】:

我建议如下计算每个单元格的高度。通过查看您的问题,我假设如果没有描述标签,所有单元格都应该具有相同的高度,对吗?假设它是 60。因此,您需要做的就是根据每个单元格的描述文本计算每个单元格的高度,并将其添加到没有描述文本的单元格高度中。在您的heightForTableView 代表中会是这样的。

- (CGFloat)heightForTableView:(UITableView *)tableView cell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath

    int cellWidth = 320; // assuming it is 320
    int constantHeight = 60;

    NSString * str = [[yourarray objectAtIndex:indexPath.row] objectForKey:@"DescriptionKey"];

    int height = [self calculateHeightForText:str withWidth:cellWidth andFont:[UIFont systemFontOfSize:16]];
    // replace systemFontSize with your own font

    return height + constantHeight;

// Depreciated in ios7
- (int)calculateHeightForText:(NSString *)string withWidth:(int)width andFont:(UIFont *)font

    CGSize textSize = [string sizeWithFont:font constrainedToSize:CGSizeMake(width, 20000) lineBreakMode: NSLineBreakByWordWrapping];

    return ceil(textSize.height);

// Introduced in iOS7
- (int)calculateHeightForText:(NSString *)string withWidth:(int)width andFont:(UIFont *)font


    int maxHeightForDescr = 1000;
    NSDictionary *attributes = @NSFontAttributeName: font;

    CGRect rect = [string boundingRectWithSize:CGSizeMake(width, maxHeightForDescr)
                                       options:NSStringDrawingUsesLineFragmentOrigin
                                    attributes:attributes
                                       context:nil];
    return rect.size.height;

我为 calculateHeightForText 编写了两种方法,一种在 iOS7 中已被贬值,适用于 iOS6 和更少以及 iOS7,但第二种方法是 iOS7 的推荐方法,但不适用于 iOS7。如果您发现一些令人困惑的事情,或者需要任何进一步的帮助,请告诉我。很乐意提供进一步的帮助。

【讨论】:

以上是关于UITableviewCell 高度自动布局的主要内容,如果未能解决你的问题,请参考以下文章

如何使用自动布局动态更改 UITableViewCell 的高度?

uitableviewcell中的swift uitableview,自动布局始终高度为0

UITableViewCell 高度自动布局在 iOS 10 上不起作用

UITableViewCell 高度根据行内容使用自动布局动态计算

滚动时 UITableViewCell 自动布局抖动的动态单元格高度问题

以编程方式使用自动布局的 UITableviewcell 中相同内容的动态高度