我正在尝试创建具有动态大小的表格单元格,特别是高度。单元格包含4行文本和图像视图。图像视图内的图像通常具有较大的分辨率,因此应缩放以适合图像视图。我使用aspectFit模式缩放图像视图内部。
如果我对单元格高度进行硬编码,则图像视图会收到额外的空间(用颜色突出显示)
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
{
return 500
}
要删除额外的填充,我需要在缩放后计算图像尺寸。 我怎么能在Swift中做到这一点?
此外,我尝试了UITableViewAutomaticDimension,但是单元格大小变得很大(取决于图像分辨率),因为单元格尺寸是基于全分辨率图像计算的,而不是基于缩放比例(使用aspectFit模式)
this answer中提供了另一种解决方案,但此解决方案的性能非常差,对于表格视图来说是不可接受的。我相信有更好的解决方案,因为图像已经按系统缩放以适应宽度,我只需要知道缩放图像的尺寸。
答案 0 :(得分:0)
在发布问题之后,我想到了新的想法。如果缩放模式总是aspectFit并且单元格宽度总是相同的,那么知道我可以计算缩放因子。之后可以计算单元格高度:
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
{
// current cell height = 4 text lines + scaled image
// Number of text lines
let numberOfTextLines: CGFloat = 4.0
// Line height of font used in text labels
let textLineHeight = UIFont.systemFont(ofSize: 17).lineHeight
// Size of image to show in cell
let imageSize = imageRecords[indexPath.row].image!.size
// Scale factor: cell width to image width
let scale = self.tableView.bounds.width / imageSize.width
// Cell height = sum of all lines height + scaled image height
return (numberOfTextLines * textLineHeight) + (scale * imageSize.height)
}
为了提高细胞高度精确度,应考虑细胞边缘。
答案 1 :(得分:0)
如果正确设置了约束,UITableViewAutomaticDimension将为您提供所需的功能。单独的屏幕截图使它变得困难(分享storyboard / xib有帮助!),但您可能希望根据我看到的内容执行以下操作:
在某些具有自动尺寸的情况下,性能仍然很糟糕,但请试一试。