UITableView异步加载不同尺寸图片,如何消除上下空白?
搞定UITableView图片上下空白的问题
兄弟,我看你这情况,图片已经能正确缩放,但上下还留着绿色空白(应该是Cell的背景色露出来了),虽然给UIImageView设了四边全0的约束,但还是没填满对吧?大概率是图片的宽高比和Cell的高度不匹配,或者Cell没开启高度自适应导致的,给你几个针对性的解决办法:
1. 先把UIImageView的显示模式调对
如果想让图片直接填满整个ImageView(超出的部分裁剪掉,不留空白),就这么设置:
imageView.contentMode = .scaleAspectFill imageView.clipsToBounds = true
要是你想完整显示整张图片(按比例缩放,这时候就得让Cell高度跟着图片走),就用这个:
imageView.contentMode = .scaleAspectFit
2. 给ImageView加个宽高比约束(核心操作)
图片本身有固定的宽高比,我们只要让ImageView跟着这个比例走,再配合四边0的约束,Cell就会自动适配图片高度,空白自然就没了。
等图片下载完成后,加这段代码:
// 假设你下载好的图片是downloadedImage let aspectRatio = downloadedImage.size.width / downloadedImage.size.height // 先移除之前可能存在的宽高比约束,避免冲突 if let oldConstraint = imageView.constraints.first(where: { $0.firstAttribute == .width && $0.secondAttribute == .height }) { imageView.removeConstraint(oldConstraint) } // 添加新的宽高比约束 let aspectConstraint = NSLayoutConstraint( item: imageView, attribute: .width, relatedBy: .equal, toItem: imageView, attribute: .height, multiplier: aspectRatio, constant: 0 ) aspectConstraint.priority = UILayoutPriority(999) // 设个稍低的优先级,防止和其他约束打架 imageView.addConstraint(aspectConstraint) // 刷新当前Cell,让Auto Layout重新计算高度 tableView.reloadRows(at: [indexPath], with: .automatic)
3. 让TableView自动计算Cell高度
别给Cell设固定高度了,打开自动行高功能,让Cell根据内部的约束自己算高度:
override func viewDidLoad() { super.viewDidLoad() tableView.dataSource = self tableView.rowHeight = UITableView.automaticDimension tableView.estimatedRowHeight = 200 // 给个大概的估计高度,帮TableView预加载 }
4. 检查下Cell里的约束有没有冲突
要是Cell里还有其他控件(比如标题Label),得确保它们的约束不会挤压ImageView的高度。比如标题在图片上面的话,要把Label的top绑到Cell的top,ImageView的top绑到Label的bottom,这样布局才不会乱。
最后提个小注意点
因为图片是异步下载的,一定要在图片下载完成后刷新对应的Cell,不然Cell会用一开始的估计高度布局,还是会留空白哦!
内容的提问来源于stack exchange,提问作者AlbertB
相关产品推荐
相关产品推荐

