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

Ios 缩放后如何计算图像尺寸?,ios,swift,uitableview,autolayout,ios-autolayout,Ios,Swift,Uitableview,Autolayout,Ios Autolayout,我正在尝试创建具有动态大小的表格单元,特别是高度。单元格包含4行文本和图像视图。图像视图中的图像通常具有较大的分辨率,因此应将其缩放以适应图像视图。我使用aspectFit模式来缩放内部图像视图 如果我硬编码单元格高度,图像视图会收到额外的空间(用颜色高亮显示) 要删除额外的填充,我需要在缩放后计算图像尺寸。 我如何在Swift中做到这一点? 我还尝试了UITableViewAutomaticDimension,但由于单元格尺寸是基于全分辨率图像计算的,而不是按比例计算的(使用aspectF

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

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

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

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


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

发布问题后,我想到了新的想法。如果缩放模式始终为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)
}

为了提高单元格高度精度,应考虑单元格边距。

发布问题后,新的想法浮现在脑海中。如果缩放模式始终为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)
}

要提高单元格高度精度,应考虑单元格边距。

如果约束设置正确,UITableViewAutomaticDimension将满足您的需要。单凭屏幕截图就很难做到(分享故事板/xib很有帮助!),但根据我看到的情况,您可能希望执行以下操作:

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

在某些情况下,使用“自动标注”时,性能仍然很差,但不妨试一试。

如果约束设置正确,UITableViewAutomaticDimension将满足您的需要。单凭屏幕截图就很难做到(分享故事板/xib很有帮助!),但根据我看到的情况,您可能希望执行以下操作:

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

在某些情况下,使用“自动标注”时,性能仍然会很差,但请试一试。

不幸的是,从“内容”视图底部到“图像”视图底部的约束在UITableViewAutomaticDimension上提供了与约束相反的行高。填充大小保持不变。遗憾的是,从内容视图底部到图像视图底部的约束在UITableViewAutomaticDimension上给出的行高度与反之亦然的约束相同。填充大小保持不变。