当前位置: 首页 > 知识库问答 >
问题:

图像下载后,高度约束快速更改后,如何更新桌面视图单元格高度?

晋俊贤
2023-03-14

如何在更新异步下载图像的图像高度约束后更新tableview单元格高度?

如何在图像下载和约束条件改变后触发tableView单元格重新布局?

最好的方法是什么?

已经尝试将代码放入Dispatmain队列,但结果同样糟糕。我在cellForRow方法中执行此操作,还将其移动到will DisplayCell。一次又一次地出现这个问题…

使用翠鸟库进行图像缓存的代码示例:

    if let imgLink = post.imageLink {
                if let url = URL(string: imgLink) {

                    cell.postImage.kf.setImage(with: url, placeholder: UIImage(), options: nil, progressBlock: nil) { (image, error, cacheType, imageURL) in

                        if let image = image, cell.tag == indexPath.row {
                            cell.heightConstraint.constant = image.size.height * cell.frame.size.width / image.size.width   
                        }
                    }
                }
    }

共有3个答案

范承望
2023-03-14

我有同样的问题。你需要记住的是Tableview重用单元格,你正在异步加载图像。

建议:你可以做的是要求你的反手团队为你提供图像的高度和宽度,这样你就可以计算单元格的高度并尽快返回。

如果无法做到这一点,则可以在数据源中保留已加载图像的大小。因此,在下载图像之前,请检查数据源的图像大小并更新高度约束常量

另一件事是你应该在单元格中都这样做(我知道这不是好的做法,而是满足表视图自动维度)

在更新高度常数后,你应该使用这对代码来重新加载你的单元格。

    cell.setNeedsLayout()
    cell.layoutIfNeeded()

我是怎么做到的

 if let imagesize = post.imageSize { 
      cell.updateHeightPerRatio(with: imagesize)

 } else {
      // Here load size from URL  and update your datasource 

  } 
  // Load image from URL with any SDWebimage or any other library you used
端木朝
2023-03-14

恕我直言,正如ppalancica所指出的那样,调用“开始更新”和“结束更新”是理想的方式。您不能从 UITableViewCell 内部引用表视图,正确的方法是使用委托并从视图控制器实现委托中调用开始更新和结束更新。

委托:

protocol ImageCellDelegate {
    func onLayoutChangeNeeded()
}

UITableViewCell实现:

class ImageCell: UITableViewCell {
    var imageView: UIImageView = ...
    var delegate: ImageCellDelegate?
    ...

    func setImage(image: UIImage) {
        imageView.image = image
        //calling delegate implemented in 'ViewController'
        delegate?.onLayoutChangeNeeded()
    }

    ...
}

ViewController实现:

class ViewController: UIViewController, UITableViewDataSource, ImageCellDelegate {
    var tableView: UITableView = ...
    .....
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let imageCell = tableView.dequeueReusableCell(withIdentifier: id, for: indexPath) as! ImageCell
        //setting 'delegate' here
        imageCell.delegate = self
        return imageCell
    }
    
    //called from 'ImageCell' when 'image' is set inside 'setImage'
    func onLayoutChangeNeeded() {
        tableView.beginUpdates()
        tableView.endUpdates()
    }

    .....
}
高自怡
2023-03-14

您可以尝试调用这2行以在图像可用后重新计算单元格高度:

tableView.beginUpdates()
tableView.endUpdates()

请参阅文档 https://developer.apple.com/documentation/uikit/uitableview/1614908-beginupdates:“您还可以使用此方法后跟 endUpdates() 方法来对行高的更改进行动画处理,而无需重新加载单元格。

 类似资料:
  • 我在表视图单元格下有一个集合视图。我在集合视图中显示所有标记值。现在,我想使表视图的高度动态变化,以便显示所有数据。用户不需要滚动集合视图。我在项目中使用自动布局。目前,我在tableView(_tableView:UITableView,heightForRowAt-indexPath:indexPath)方法中返回“UITableView.automaticDimension”,并使集合视图滚

  • 在 Swift 中使用 ,有人可以帮助我根据标签、图片和描述自动更改单元格的高度吗? 我想随着标签文本的增加动态更改单元格大小。我已经在标签上应用了自动布局。

  • 我在表格视图中的自定义单元格中有一个标签。我想在用户录制单元格后更改单元格高度和标签高度(起初我只显示2行,我想显示更多文本), 我可以根据单元格内容更改单元格高度,但不幸的是,我无法更改标签高度:(我已经阅读了大量stackoverflow答案,但仍然一无所获。 人们认为这是可行的: 但这在iOS 7中被弃用;任何人都可以帮我调整单元格中的标签大小吗?

  • 问题内容: 使用CSS flex box模型,如何强制图像保持其纵横比? JS小提琴:http://jsfiddle.net/xLc2Le0k/2/ 请注意,图像会拉伸或收缩以填充容器的宽度。很好,但是我们也可以拉伸或缩小 高度 以保持图像比例吗? 的HTML 的CSS 问题答案: 对于img标签,如果您定义一侧,那么将调整另一侧的大小以保持纵横比,并且默认情况下,图像会扩展到其原始大小。 使用此

  • 问题内容: 单击时,我必须调整tableView的一行的大小。我该怎么做?有人可以帮助我吗? 我的视图控制器类: 问题答案: 首先,您必须跟踪属性中当前选定单元格的indexPath: 它应该是可选的,因为您不能选择任何单元格。接下来让我们声明选定状态和未选定状态的高度(将值更改为所需的值): 现在您必须实现: 现在,在您的方法中,您必须检查是否选中了选定行或未选定行: 该和电话是给你一个动画的高

  • 我为包含和的自定义单元格创建了一个文件。宽度是固定的,但高度应根据下载图像的大小进行调整。 此外,单元格高度应该调整,以保持它与图像视图之间的边距。 当我读到几篇关于自动布局的文章时,我不太确定我在这里做了什么:(如果有任何错误,请指出正确的方法) > 为了保持和之间的边距,我应该创建一个约束。 前一步是通过选择和>,然后转到编辑器- 到目前为止,假设如果我调整图像视图的高度,单元格会自动调整自己