class ImageViewCell: UITableViewCell {
lazy var bgView: UIView = {
let boadeView = UIView()
return boadeView
}()
private lazy var titleIcon: UIImageView = {
let icon = UIImageView()
icon.image = UIImage(named: "box_info_title")
return icon
}()
private lazy var line: UIView = {
let view = UIView()
return view
}()
private lazy var listView: UIStackView = {
let view = UIStackView()
view.axis = .vertical
view.alignment = .fill
view.distribution = .fill
view.spacing = 0
return view
}()
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
setupUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func setupUI() {
bgView.backgroundColor = .white
contentView.addSubview(bgView)
bgView.snp.makeConstraints { make in****
make.top.equalToSuperview()
make.left.right.equalToSuperview().inset(10)
make.bottom.equalTo(-12)
}
bgView.addSubview(titleIcon)
titleIcon.snp.makeConstraints { make in****
make.left.top.equalTo(12)
make.width.equalTo(59)
make.height.equalTo(24)
}
bgView.addSubview(line)
line.snp.makeConstraints { make in****
make.left.right.equalToSuperview().inset(12)
make.top.equalTo(titleIcon.snp.bottom).offset(4)
make.height.equalTo(1)
}
bgView.addSubview(listView)
listView.snp.makeConstraints { make in****
make.left.right.equalToSuperview().inset(12)
make.top.equalTo(line.snp.bottom).offset(8)
make.bottom.equalTo(-12)
}
}
func configure(with imageUrls: [String]?) {
for view in listView.subviews {
view.removeFromSuperview()
}
if let imageUrls = imageUrls, imageUrls.count > 0 {
for (index, url) in imageUrls.enumerated() {
let imageView = UIImageView()
imageView.contentMode = .scaleAspectFill
imageView.clipsToBounds = true****
imageView.translatesAutoresizingMaskIntoConstraints = false****
listView.addArrangedSubview(imageView)
imageView.kf.setImage(with: URL(string: url)) { result in****
switch result {
case .success(let value):
let image = value.image
let ratio = image.size.height / image.size.width
let width = UIScreen.main.bounds.width - 24
let height = width * ratio
imageView.heightAnchor.constraint(equalToConstant: height).isActive = true****
default:
break****
}
}
}
}
}
}
✅ SnapKit + UIStackView 使网络图片异步加载完成后cell自适应高度
你可以用 SnapKit 给
UIStackView
设置:
| 约束位置 | 示例 |
|---|---|
| 添加到父视图 | make.edges.equalToSuperview() |
| 内部方向控制 | stackView.axis = .vertical 等属性 |
| 控制子视图对齐 | 用 .alignment, .distribution 控制 |
| 设置间距 | stackView.spacing = 8 |
记得添加imageView时 使用UIStackView的addArrangedSubview方法
外部设置cell高度自适应