ios - 如何布局具有不同高度的自定义 UITableViewCell

标签 ios iphone uitableview layoutsubviews

我有一个 UITableViewCell 子类,它有一个图像、标题和描述。 我应该根据描述内容长度调整单元格高度,即如果它跨越超过 5 行,我应该扩展它(+其他 subview ,如图像等)直到它持续。

下一个细胞应该在那之后开始。

我的 UITableViewCell 子类是从 xib 实例化的,它具有固定的行高 = 160。

我知道这是非常标准的要求,但我找不到任何指南。

我已经像这样扩展了 layoutSubViews:

- (void) layoutSubviews
{
    [self resizeCellImage];
}

- (void) resizeCellImage
{
    CGRect descriptionRect = self.cellDescriptionLabel.frame;
    CGRect imageRect = self.cellImageView.frame;

    float descriptionBottomEdgeY = descriptionRect.origin.y +  descriptionRect.size.height;
    float imageBottomEdgeY = imageRect.origin.y + imageRect.size.height;

    if (imageBottomEdgeY >= descriptionBottomEdgeY)
        return;

    //push the bottom of image to the bottom of description
    imageBottomEdgeY = descriptionBottomEdgeY;

    float newImageHeight = imageBottomEdgeY - imageRect.origin.y;
    imageRect.size.height = newImageHeight;
    self.cellImageView.frame = imageRect;

    CGRect cellFrame = self.frame;
    cellFrame.size.height = imageRect.size.height + imageRect.origin.y + 5;

    CGRect contentFrame = self.contentView.frame;
    contentFrame.size.height = cellFrame.size.height - 1;
    self.contentView.frame = contentFrame;

    self.frame = cellFrame;
}

它几乎告诉我们,如果描述比图像高,我们必须调整图像大小以及单元格高度以适合描述。

但是当我通过这样做调用这段代码时:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    cell.cellDescriptionLabel.text = @"Some long string";
    [cell.cellDescriptionLabel sizeToFit];
    [cell setNeedsLayout];

    return cell;    
}

似乎由于调用 layoutSubViews 更改了单元格框架,但其他单元格不遵守它。也就是说,如果前一个单元格不会自行调整大小,它们就会出现在相同的位置。

两个问题:

  • 如何让我想要的成为可能?
  • 我在 cellForRowAtIndexPath 中调用 setNeedsLayout 是否正确?

P.S.:我知道 heightForRowAtIndexPath 是改变单元格高度的关键,但我觉得我作为 cellForRowAtIndexPath 的一部分所做的数据解析(此处未显示)会只是为了计算高度就有点矫枉过正了。我需要一些可以直接告诉 UITableViewCell 根据内容需要调整自身大小的东西。

最佳答案

-tableView:heightForRowAtIndexPath: 是设计如何计算可变大小的单元格。单元格的实际框架并不重要,表格 View 会更改它以满足其需要。

你有点倒过来想了。委托(delegate)告诉表格 View 需要如何绘制单元格,然后表格 View 强制单元格适应这些特征。您唯一需要向单元格提供的是它需要保存的数据。

这是因为表格 View 在要绘制任何单元格之前计算所有单元格的所有高度。这样做是为了允许 TableView 正确调整其 ScrollView 的大小。它允许适当大小的滚动条和平滑的快速平移通过 TableView 。仅当 TableView 认为需要在屏幕上显示单元格时才请求单元格。


更新:如何获取单元格高度

我不得不这样做几次。我让我的 View Controller 保留一个从未在 TableView 中使用的单元格。

@property (nonatomic) MyTableViewCell *standInCell;

然后,当我需要测量时,我会使用这个单元格作为替身。我确定了没有可变大小 View 的单元格的基本高度。

@property (nonatomic) CGFloat standInCellBaseHeight;

然后在 -tableView:heightForRowAtIndexPath: 中,我使用该索引路径的实际数据获取所有可变大小 View 的高度。我将可变大小的高度添加到我的单元格基本高度中。我返回新计算的高度。

注意,这都是非自动布局。我确信这种方法与此类似,但不完全相同,但我没有经验。

关于ios - 如何布局具有不同高度的自定义 UITableViewCell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21414383/

相关文章:

ios - UITableView setSeparatorInset 不能正常工作

ios - 倒数计时器的圆形进度条/PIE

iphone - 使用 AVPlayer 循环播放一小段视频,然后向后播放

ios - 如何根据条件设置初始 View Controller ?

iPhone内存测试

iphone - UITableView 中的可重用单元格

ios - 将现有的核心数据迁移到 iCloud

ios - 快速截取 Textfield 的屏幕截图?

iphone - 在弹出标注和用户点击公开按钮后,如何防止与 MKAnnotation 关联的数据丢失?

ios - UITableView 添加的数据不遵循与示例数据相同的布局