我有一个 UITableViewCell 子类,它有一个图像、标题和描述。我应该根据描述内容长度调整单元格高度的大小,即如果它跨越超过 5 行,我应该扩展它(+其他子视图,如图像等)直到它持续。
下一个细胞应该在那之后才开始。
我有我的 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
调用而改变,但其他单元格不尊重它。也就是说,如果前一个单元格不会自行调整大小,它们会出现在相同的位置。
两个问题:
- 如何实现我想要的?
- 我通过调用 inside 做得对
setNeedsLayout
吗cellForRowAtIndexPath
?
PS:我知道heightForRowAtIndexPath
改变单元格高度的关键,但我觉得我做的数据解析(此处未显示)cellForRowAtIndexPath
只是为了计算高度而过度杀伤。我需要一些可以直接告诉UITableViewCell
根据内容需要调整自身大小的东西。