Swift 网络图片动态适应cell高度 SnapKit + UIStackView 使网络图片异步加载完成后cell自适应高度

100 阅读1分钟

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

image.png

image.png

记得添加imageView时 使用UIStackView的addArrangedSubview方法

image.png

外部设置cell高度自适应

image.png