如何使用heightForRowAtIndexPath更改UITableViewCell的动态高度?

时间:2014-11-12 14:42:01

标签: ios objective-c uitableview

我有原型细胞。我里面有几个标签。我使用自动布局来调整其中一个标签以更改高度和适合内容。我需要调整整个UITableViewCell的大小。

在事件heightForRowAtIndexPath上,我创建了一个虚拟单元格来计算高度。我使用以下example。我必须设置正确的高度。我的问题是它返回0.

我认为的问题在于以下代码:

CGSize size = [self.prototypeCell.contentView
               systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
return size.height+1;

内容视图的高度为44,但方法返回0.结果我看到单元格高度为1。

修改

我的整个方法的代码是:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self configureCell:self.prototypeCell forRowAtIndexPath:indexPath];

    self.prototypeCell.bounds = CGRectMake(0.0f, 0.0f, CGRectGetWidth(self.twDetails.bounds), CGRectGetHeight(self.prototypeCell.bounds));

    //[self.prototypeCell layoutIfNeeded];
    [self.prototypeCell.contentView setNeedsLayout];
    [self.prototypeCell.contentView layoutIfNeeded];

    CGSize size = [self.prototypeCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];

    return size.height+1;
}

编辑2:

我认为我错误地在这个地方再次调用configureCell:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    PESvcPaymentDetailsCell *dispositionCell = [tableView dequeueReusableCellWithIdentifier:dispositionCellIdentifier forIndexPath:indexPath];

    if(indexPath.row <= singApp.operationPostpaidDispositionsList.dispositionsCount - 1) {

       [self configureCell:dispositionCell forRowAtIndexPath:indexPath];

    }
    else {
    }

    //[tvCellsArray addObject:dispositionCell];
    return dispositionCell;
}

所以我可以通过这样做再次初始化它吗?

1 个答案:

答案 0 :(得分:0)

试试这个。您需要临时为indexPath重新配置自定义单元格并返回其高度。

在您的configureCell:forRowAtIndexPath:方法中 - 确保您正在向单元格的contentView添加任何视图/标签。

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

    // Instantiate a mock custom cell
    PESvcPaymentDetailsCell *dispositionCell = [[PESvcPaymentDetailsCell alloc] init];

    // Configure it based on the index path
    [self configureCell:dispositionCell forRowAtIndexPath:indexPath];

    // Make sure its frame is updated
    [dispositionCell.contentView setNeedsLayout];
    [dispositionCell.contentView layoutIfNeeded];

    // Return the height
    return [dispositionCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;

}