我有一个 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/