缩放后如何计算图像尺寸?

时间:2017-01-17 09:48:52

标签: ios swift uitableview autolayout ios-autolayout

我正在尝试创建具有动态大小的表格单元格,特别是高度。单元格包含4行文本和图像视图。图像视图内的图像通常具有较大的分辨率,因此应缩放以适合图像视图。我使用aspectFit模式缩放图像视图内部。

Cell layout

如果我对单元格高度进行硬编码,则图像视图会收到额外的空间(用颜色突出显示)

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
{
    return 500
}

Horizontal image

要删除额外的填充,我需要在缩放后计算图像尺寸。 我怎么能在Swift中做到这一点?

此外,我尝试了UITableViewAutomaticDimension,但是单元格大小变得很大(取决于图像分辨率),因为单元格尺寸是基于全分辨率图像计算的,而不是基于缩放比例(使用aspectFit模式)

this answer中提供了另一种解决方案,但此解决方案的性能非常差,对于表格视图来说是不可接受的。我相信有更好的解决方案,因为图像已经按系统缩放以适应宽度,我只需要知道缩放图像的尺寸。

2 个答案:

答案 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有帮助!),但您可能希望根据我看到的内容执行以下操作:

  • 删除图像视图上的底部约束
  • 从内容视图底部的添加约束图像视图的底部
  • 使用UITableViewAutomaticDimension

在某些具有自动尺寸的情况下,性能仍然很糟糕,但请试一试。