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

时间:2017-10-17 10:14:03

标签: ios objective-c uiimageview autolayout sdwebimage

我在GitHub上构建了a sample project

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

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

实际上,谷歌搜索结果中的所有自动布局教程或示例都是基于本地图像资源进行测试的,基本上没有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];
}];

假设网络图像的大小为400x400点,单元格中没有保留占位符图像,更新约束和布局子视图'请求将准备好并异步成功完成。但是,新单元格的高度不会被重新计算到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];
}];

最终图像将最终以相同大小的保留占位符图像绘制,但我希望最终图像的大小均匀指定比例。

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

请帮助,谢谢!

0 个答案:

没有答案