更新图像高度约束后更新表格视图单元格高度

Posted

技术标签:

【中文标题】更新图像高度约束后更新表格视图单元格高度【英文标题】:Update tableview cell height after updating image height constraint 【发布时间】:2017-09-08 07:18:38 【问题描述】:

我有这样的表格视图单元格。

然后我更新了图像高度约束并重新加载。我正在使用自动调整单元格大小并在 ios 10 上进行测试。

How to animate UITableViewCell height using auto-layout?

imageHeightConstraint.constant = 200 //example only. it will be dynamic. Some image height will be 200, 400, etc
self.contentView.layoutIfNeeded()
UIView.setAnimationsEnabled(false)
self.delegate?.getTableView!().beginUpdates()
self.delegate?.getTableView!().endUpdates()
UIView.setAnimationsEnabled(true)

我也尝试只重新加载 1 行,但不行。

self.contentView.layoutIfNeeded()
let indexPath = IndexPath(item: self.tag, section: 0)
self.delegate?.getTableView!().beginUpdates()
self.delegate?.getTableView!().reloadRows(at: [indexPath], with: .none)
self.delegate?.getTableView!().endUpdates()

问题是它根本不会改变高度,除非我像这样重新加载表格。

imageHeightConstraint.constant = 200
self.delegate?.getTableView!().reloadData()

但我不想调用 reloadData,因为它会重新加载所有可见的单元格和资源密集型(当用户快速滚动时也会延迟)。我应该如何正确更新我的图像约束并正确更新表格视图单元格(自动调整大小)高度?

编辑 - 使用固有尺寸

我删除了我的高度约束,只在 UIImageview 中使用了固有大小的属性。那么高度是正确的,但宽度太大(因为它是内在的)。我该怎么办?

【问题讨论】:

我也尝试只重新加载 1 行,但不行。 -> 这是正确的代码。在 cellForRow 中,您如何更改同一单元格的图像高度? , 以及如何识别需要改变高度的单元格? 我更改了图像高度约束,每次更改该约束后,我都会重新加载 cell 。每个单元格都有等于 indexPath.row 的标签。 过去,我遇到过这种情况,我需要扩展单元格,我所做的是我跟踪 indexPath Globally ,并做了同样的事情,你为重新加载 1 Row 以及保持 @987654329 @ 保存到全局对象,并在行的单元格中检查当前 indexPath 是否与全局 indexPath 匹配,然后设置任何常量 【参考方案1】:

ImageViews 具有固有大小。这意味着它们会根据图像的内容来确定大小。除非您对图像应用宽度和高度约束,否则 imageView 应该能够根据图像大小调整自身大小。

你可以利用tableView的高度属性

    self.tableView.rowHeight = UITableViewAutomaticDimension
    self.tableView.estimatedRowHeight = 100

现在选择您的单元格并设置前导、尾随、顶部和底部约束。确保不要手动设置高度/纵横比约束。

现在,如果您只是将图像加载到 imageView,单元格将根据图像的大小自动调整大小。

编辑:

如果您正在加载的图像在特定大小范围内,则此方法有效。如果您想缩小图像或将高度约束设置为图像并在下载图像后更新其高度,则无需重新加载整个 tableView 而是可以重新加载 tableView 中的特定单元格

self.tableView.reloadRows(at: [yourIndexPath], with: .none)

在这种情况下,请确保您实施

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 

编辑:

将您的 imageView 内容模式设置为 AspectFitAspectFill from ScaleTofill

【讨论】:

我需要从我的后端服务器下载图片,然后设置 imageview。那么,我可以依赖内在大小吗?我觉得它需要再次重新加载单元格,因为在下载图像后单元格布局已经完成。 @khant-thu-linn :您可以重新加载特定单元格而不是重新加载整个 tableView @khant-thu-linn :更好的做法是服务器向您发送您需要加载的图像的纵横比,以及索引路径处行的高度您计算指定纵横比的高度比率作为 imageView 的宽度是固定的并返回相同。这里发生的情况是,当您实际下载数据时,您的单元格不需要再次自行布局,因为单元格已经足够大以容纳图像。这就是为什么在应用中加载图像异步布局时不会改变 啊,明白了。我已经更新了我的问题。我听从了你的建议,高度是正确的,但宽度是错误的。我该怎么办? 是的。我总是希望服务器向我发送纵横比,但后端开发人员每次我建议时都想和我打架。 :D .

以上是关于更新图像高度约束后更新表格视图单元格高度的主要内容,如果未能解决你的问题,请参考以下文章

异步图像下载和调整图像高度后如何更新表格视图单元格

重用 tableviewcell 中的约束和高度未更新

iOS - 表格视图单元格中的自动布局问题

如何根据标签文本快速更改表格视图单元格高度?

重新加载行以更新 UITableView 中的单元格高度时出现问题

如何更新 UITableViewCell 约束常量并更新单元格高度