关于 ios:UITableViewCell 中带有 AutoLayout 的动态图像高度

Dynamic image heights in UITableViewCell with AutoLayout

我有一个 UITableViewCell,其中包含多个组织成垂直堆栈布局的数据。其中一些是垂直动态的,一个是 UILabel,一个是 UIImageView。

UIImageView 是我遇到的问题。我在 UITableViewCell 中设置了一个带有出口的高度约束。图像加载异步,因此 UITableViewCell 行的高度将是错误的,我们只有在加载图像后才知道行的真实高度。当我将约束设置为在图像加载后更新为适当的纵横比时,我的 UITableView 变得完全不可靠,图像到处跳跃并且格式根本无法正常工作。

我在 StackOverflow 中看到另一篇文章,其中提到您应该预先检查图像,获取它们的宽度和高度,以便我们可以在加载图像之前确定并设置约束。这确实允许平滑滚动。

我的问题是:这是唯一的方法吗?是否有更好的技术来使用具有动态图像大小的 AutoLayout?它们会是什么?

我试过调用 setNeedsLayout、setNeedsUpdateConstraints、updateConstraintsIfNeeded 等......它们似乎都不起作用。

有什么建议吗?

詹姆斯


如果您需要根据图像大小预测单元格高度,那么是的,如果您想设置具有动态动画和可接受的滚动性能的平滑布局,您应该预先检查图像。

例如,Pinterest 在 API 响应中为请求的 Pin 返回图像大小,因为他们希望您在异步获取图像之前设置布局,实际上,他们在自己的 iOS 应用程序中做同样的事情(您可以在这里探索他们的 API) .带有图像扩展信息的 Pinterest API 响应示例:

1
2
3
4
5
6
7
8
9
root:{} 1 item
 data:{} 5 items
 note:A hardened leather thimble to make stitching leather easier!
 url:https://www.pinterest.com/pin/310959549256036760/
 image:{} 1 item
  original:{} 3 items
   url:https://s-media-cache-ak0.pinimg.com/originals/b2/19/ec/b219ec9b8418233c651de9d17bd00e4a.jpg
   width:640
   height:640

第二个选项,使用"伪动态高度"。主要思想是,您的单元格高度始终是可预测和预先计算的,但是单元格内的图像具有动态大小。我最近在这里缝制的这种解决方案的最佳解释 - 调整表格视图单元格。