如何基于URL下载的图片设置Table Cell中ImageView的动态高度
如何用Kingfisher加载图片后设置UITableViewCell中ImageView的动态高度
嘿,我刚好折腾过类似的需求,用Kingfisher加载网络图后让TableViewCell里的ImageView自适应高度其实挺顺手的,分几步来就行:
首先,先给你的TableView开自动行高,这是动态高度的基础,在viewDidLoad里加这两行:
tableView.rowHeight = UITableView.automaticDimension tableView.estimatedRowHeight = 200 // 给个预估高度,避免列表加载时跳动太厉害
然后,确保你的Cell里的ImageView约束设置对了:
- 给ImageView加上顶部、底部、左右和Cell内容视图的约束(或者根据你的布局调整,但必须有上下约束,这样AutoLayout才能算出整体行高)
- 把ImageView的
contentMode设成.scaleAspectFit或者.scaleAspectFill,记得开clipsToBounds避免图片溢出:cell.doseImg.contentMode = .scaleAspectFit cell.doseImg.clipsToBounds = true
接下来是关键的一步:利用Kingfisher的加载回调获取图片尺寸,然后动态调整ImageView高度。修改你的Kingfisher加载代码,加上completionHandler:
cell.doseImg.kf.setImage(with: URL(string: imgUrl)) { result in switch result { case .success(let value): // 拿到加载成功的图片 let loadedImage = value.image // 计算图片的宽高比,再结合ImageView的实际宽度算出目标高度 let imageRatio = loadedImage.size.height / loadedImage.size.width let imageViewWidth = cell.doseImg.frame.width let targetHeight = imageViewWidth * imageRatio // 这里要注意:如果是用Storyboard/Xib做的Cell,得把ImageView的高度约束拉成Cell的IBOutlet属性,比如叫imageHeightConstraint cell.imageHeightConstraint.constant = targetHeight // 让Cell重新布局,再通知TableView刷新该行的高度 cell.layoutIfNeeded() self.tableView.beginUpdates() self.tableView.endUpdates() case .failure(let error): print("图片加载炸了: \(error.localizedDescription)") // 加载失败的话,给个默认高度兜底 cell.imageHeightConstraint.constant = 200 cell.layoutIfNeeded() } }
额外提个小细节:如果图片已经在Kingfisher的缓存里,这个回调会立刻执行,不会有明显的延迟,体验还是不错的。
要是你不想手动计算高度,也可以试试让AutoLayout自己推导——不过上面的方法更可控,能精准控制ImageView的高度,避免一些奇怪的布局问题。
内容的提问来源于stack exchange,提问作者AbhiRaz
相关产品推荐
相关产品推荐

