常见的一种方法是异步Completed时,根据图片大小计算cell的高度并缓存到字典里后,刷新tableView或indexPath。
但这里介绍另一种更好的方式是使用约束处理,对imageView的上下左右与其superView设置好约束后,再设置一个长宽比(ratio)约束,在图片load completed后,再remake长宽比(ratio)约束, 代码如下:
var aspectWHRatio: CGFloat {
if let image = imageView.image {
return image.size.width/image.size.height
}
return UIScreen.main.bounds.width / 1.0
}
// auto adapt image size
imageView.sd_setImage(with: url,
placeholderImage: UIImage(named: "xxxx"),
options: .retryFailed) { image, _, _, _ in
DispatchQueue.main.async { [weak self] in
guard let self = self, image != nil else { return }
self.imageView.snp.remakeConstraints { make in
make.top.equalToSuperview().offset(24.pt)
make.bottom.equalToSuperview().offset(-24.pt)
make.left.right.equalToSuperview()
make.width.equalTo(self.imageView.snp.height).multipliedBy(self.aspectWHRatio)
}
}
}