如何自动调整 tableview 高度 + stackview

How to auto resize tableview height + stackview

我正在尝试实现此功能:

在表格视图的每个单元格中显示标题、描述和图像。 但是,图像可能为零。 要求是:

  1. 当图像为 nil 时,自动扩展标签以适合整个单元格
  2. Tableview 单元格高度应根据描述标签自动调整。
  3. 需要使用stackView

我以编程方式完成了此操作:

  1. 设置这是表格视图:

     tableView.rowHeight = UITableView.automaticDimension
     tableView.estimatedRowHeight = 200
    
  2. 创建 2 个 Stackview:一个用于标签,一个用于标签 + 图像:

    let contentStack: UIStackView = {
        var view = UIStackView()
        view.axis = .horizontal
        view.spacing = 16
        view.distribution = .equalSpacing
        view.translatesAutoresizingMaskIntoConstraints  = false
        return view }()
    
    let labelStack: UIStackView = {
        var view = UIStackView()
        view.axis = .vertical
        view.spacing = 5
        view.translatesAutoresizingMaskIntoConstraints = false
        view.distribution = .fillProportionally
        return view }()
  1. 使用自动布局设置约束:
func setupUI() {
        contentView.addSubview(contentStack)
        labelStack.addArrangedSubview(titleLabel)
        labelStack.addArrangedSubview(descriptionLable)
        contentStack.addArrangedSubview(labelStack)
        contentStack.addArrangedSubview(iconView)
        
        NSLayoutConstraint.activate([

            iconView.heightAnchor.constraint(equalToConstant: 80),
            iconView.widthAnchor.constraint(equalToConstant: 80),

            contentStack.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 16),
            contentStack.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 16),
            contentStack.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -16),
            contentStack.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -16)
        ])
        layoutIfNeeded()
    }

但是,此代码不会自动调整 tableview 单元格的高度,您可以从屏幕截图中看到,单元格不会根据标签的长度扩展。

使用 stackview 执行此操作的最佳方法是什么?

这是我目前得到的:

一些变化...

现在,您的 80 磅高度图像视图将 contentStack 高度限制为 80 点,因此在您的 contentStack 设置中,使用以下任一方法:

view.alignment = .top

// or

view.alignment = .center

将您的 labelStack 设置更改为:

view.distribution = .fill   // NOT .fillProportionally

确保设置:

titleLabel.setContentCompressionResistancePriority(.required, for: .vertical)
descriptionLabel.setContentCompressionResistancePriority(.required, for: .vertical)

编辑

这是包含长说明和短说明以及有/没有图像的外观。标签有青色背景,图像视图有黄色背景,所以你可以看到框架...

如果顶部和底部“填充”过多,您需要调整顶部和底部约束常量。