如何调整包含在UITableview自定义单元格中的UIImageview,具体取决于动态图片网址的高度?

时间:2017-10-09 12:29:14

标签: ios swift3 uiimageview autolayout ios-autolayout

我在自定义UITableviewcell中有一个UIImageview和很少的其他组件,在一个单独的xib文件中,我将其加载到我的UITableview中,该UITableview位于UIView子类中并动态地从URL分配图像。

现在问题是,我想根据从URL获得的图像大小动态调整UIImageview和Tableview行的高度。我使用以下代码完成了这项工作,

    if  let bpImageUrls = singleComponent["picture_link"]{
        cell.newsImage.sd_setShowActivityIndicatorView(true)
        cell.newsImage.sd_setIndicatorStyle(.gray)
        cell.newsImage.sd_setImage(with: URL(string: bpImageUrls as! String))

        let imageData =  NSData(contentsOf:URL(string: bpImageUrls as! String)!)

        let myImage = UIImage(data: imageData! as Data)
        let aspectRatio = ( myImage?.size.height)! / ( myImage?.size.width)!

        cell.imageHeightConstraint.constant = UIScreen.main.bounds.size.width * aspectRatio
    }

它就像一个魅力,但问题是,这会减慢UITableview的滚动事件,当我试图异步下载图像并更新主线程中的视图时,它不起作用

视图与自动布局相关联,就像在这个image中一样,我现在已经挣扎了一段时间。任何见解都会有所帮助。感谢。

1 个答案:

答案 0 :(得分:0)

当您以异步方式加载图像时,表视图已完成单元格的布局。只是根据图像高度更改单元格的高度约束不会更改表格视图中单元格的高度。

更改高度约束后,必须使表格视图重新计算单元格的高度。因此,当加载图像并更改单元格的高度约束时,请通过调用告诉表视图重新加载该单元格:

if let indexPath = tableView.indexPath(for: cellWithImage) {
    tableView.reloadRows(at: [indexPath], with: UITableViewRowAnimation.automatic)
}