Swift 4/5 中如何让UIImageView根据图片尺寸动态调整宽高比
CollectionView 自适应图片原始尺寸解决方案
方案1:Cell大小跟随图片原始比例自适应(推荐)
适用于需要完整展示图片、不想留多余空白的场景
- 优先让后端在返回图片URL的同时,附带每张图片的原始宽、高字段,提前存储到你的数据模型中,避免下载后再计算比例导致的布局跳变
若后端无法新增字段,可在图片下载完成后通过
UIImage.size读取原始宽高,更新对应数据模型后刷新对应位置的Cell即可 - 实现CollectionView的尺寸动态计算逻辑:
如果你需要固定Cell宽度为屏幕宽度,可通过UICollectionViewDelegateFlowLayout的sizeForItemAt方法计算高度:
iOS13及以上也可以用func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { let currentImageModel = dataSource[indexPath.item] let screenWidth = UIScreen.main.bounds.width // 计算图片宽高比 let aspectRatio = currentImageModel.originalHeight / currentImageModel.originalWidth return CGSize(width: screenWidth, height: screenWidth * aspectRatio) }UICollectionViewCompositionalLayout实现更顺滑的自适应效果 - Cell内的UIImageView不要写死宽高约束,只需要设置leading、trailing、top、bottom四个约束紧贴Cell的
contentView,同时根据需求设置显示模式:- 选
scaleAspectFit:图片完全显示不裁剪,比例和原始完全一致 - 选
scaleAspectFill:图片填充满整个Cell,超出部分裁剪,需额外开启clipsToBounds = true避免内容溢出
- 选
方案2:固定Cell大小,图片完整显示
如果不需要调整Cell高度,还是维持你原来的宽屏宽、高180的设置,只需要把UIImageView的contentMode设置为scaleAspectFit即可,图片会等比例缩放后完整显示在固定区域内,不会拉伸变形,仅会在上下/左右留下空白区域。
注意事项
- 不要使用
scaleToFill显示模式,会强制拉伸图片适配控件大小,丢失原始比例 - 如果是下载图片后才更新Cell高度,建议把计算好的高度缓存到数据模型中,避免滚动时重复计算导致卡顿
内容的提问来源于stack exchange,提问作者Akash Neeli
相关产品推荐
相关产品推荐

