UITableviewCell高度自动布局

时间:2014-11-06 05:18:33

标签: ios objective-c uitableview autolayout

我有以下UITableviewCell布局,我使用autolayout来处理这个

========= 
| 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 :设置空工作但是有更好的方法吗?

2 个答案:

答案 0 :(得分:0)

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

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

而不是heightForRowAtIndexPath,您可以检查同一行的相同条件,并且可以返回不显示描述标签时所需的高度。

让我们说,

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

答案 1 :(得分:0)

我建议按如下方式计算每个细胞的高度。通过查看你的问题,我假设如果没有描述标签,所有单元格应该具有相同的高度,对吗?假设它是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。如果您发现令人困惑的事情,或者需要任何进一步的帮助,请告诉我。很乐意进一步帮助。