如何通过SDWebImage下载图像后,根据图像大小自动布局UIImageview

我在GitHub上构建了一个示例项目 。

有一个表格视图,其自定义单元格具有多行UILabel和基于其图像大小的动态图像视图。 我逐步构建它以validation自定义单元格上的自动布局问题。

在具有上述视图结构的第3个示例表视图( Table3ViewController )中,我使用样本随机长度文本和本地图像对其进行了测试。 它成功了,就像Apple文档和这个post所说的那样。

实际上,谷歌搜索结果中的所有自动布局教程或示例都是基于本地图像资源进行测试的,基本上没有SDWebImage使用相关。

Table4ViewController ,UIImageView / UITableViewCell(CustomCell)在SDWebImage异步将最终图像对象设置为UIImageView之前完成了其子视图的布局。

这是我的问题,如何在SDWebImage从网络下载图像后重新布局UITableViewCell(CustomCell)?

以下是我在CustomCell中的约束。

  [label mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(self.contentView.top); make.centerX.width.equalTo(self.contentView); make.bottom.equalTo(imageView.top); make.height.greaterThanOrEqualTo(@16); }]; [imageView mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(label.bottom); make.bottom.equalTo(self.contentView.bottom); make.centerX.width.equalTo(self.contentView); make.height.lessThanOrEqualTo(@200); }]; 

我试图将实现移动到initWithStyle:reuseIdentifier:updateConstraintslayoutSubviews方法,所有结果都相同且失败。

这是没有占位符图像的 cellForRow的图像视图分配。

 __weak __typeof(cell) weakCell = cell; [cell.theImageView sd_setImageWithURL:[NSURL URLWithString:dict.allValues.firstObject] completed:^(UIImage *_Nullable image, NSError *_Nullable error, SDImageCacheType cacheType, NSURL *_Nullable imageURL) { __strong __typeof(cell) strongCell = weakCell; [strongCell setNeedsUpdateConstraints]; [strongCell updateConstraintsIfNeeded]; }]; 

假设网络图像的大小为400×400点,单元格中没有保留的占位符图像,更新约束和布局子视图的请求将准备好并异步成功完成。 但是,新单元格的高度不会重新计算到tableview的contentSize中,也不会调用CustomCell的绘制过程。 它失败。


以下是带有占位符图像的 cellForRow的图像视图分配。

 __weak __typeof(cell) weakCell = cell; [cell.theImageView sd_setImageWithURL:[NSURL URLWithString:dict.allValues.firstObject] placeholderImage:GetImageWithColor(DarkRandomColor, CGRectGetWidth(tableView.frame), 400) completed:^(UIImage *_Nullable image, NSError *_Nullable error, SDImageCacheType cacheType, NSURL *_Nullable imageURL) { __strong __typeof(cell) strongCell = weakCell; [strongCell setNeedsUpdateConstraints]; [strongCell updateConstraintsIfNeeded]; }]; 

最终图像将使用相同大小的保留占位符图像最终绘制,但我期望最终图像的大小甚至指定比例。

那么,如何在异步下载图像后重新布局图像视图的大小约束?

请帮忙,谢谢!