带有 AutoLayout 的 UITableViewCell 中的动态图像高度

Dynamic image heights in UITableViewCell with AutoLayout

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

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

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

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

我试过调用 setNeedsLayout、setNeedsUpdateConstraints、updateConstraintsIfNeeded 等...None 似乎有效。

有什么建议吗?

詹姆斯

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

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

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

第二个选项,使用"pseudo dynamic height"。主要思想是,您的单元格高度始终是可预测和预先计算的,但单元格内的图像具有动态大小。我最近在这里缝制了这种解决方案的最佳解释 - Self-sizing Table View Cells.