【问题标题】:UITableViewCell with StackView not dynamically sizing height带有 StackView 的 UITableViewCell 不能动态调整高度
【发布时间】:2018-12-18 17:19:11
【问题描述】:

我有一个自定义UITableViewCell,其中包含一个StackView,其中包含单元格内容视图的顶部、底部、前导和尾部约束。

当我设置 tableView 时,我给它一个估计的高度,并将 rowHeight 设置为 UITableViewAutomaticDimension

在我的cellForRowAt 数据源方法中,我将单元格出列,然后调用cell.setup(),它将任何给定数量的视图添加到我的单元格的stackView。

问题是:我的单元格总是被调整为 80p 的估计高度。无论我向单元格的 stackView 添加了多少视图,它都会被塞进 80p 的高度。在 cellForRowAt 数据源方法返回之前,stackView 和单元格不会随着我插入单元格的每个新项目而增长。

我为我的 stackView 尝试了不同的分发设置,但我不确定我在这里做错了什么。

【问题讨论】:

  • 您是否实施了heightForRowAt 以返回 80?如果是这样,你不应该这样做。如果没有,您要添加的 “任何给定数量的视图” 是否有高度限制?如果不是,那可能就是问题所在。
  • 为了使单元格的动态大小起作用,单元格内容必须能够自行定义高度。 UIStackView 不能这样做,因为它会调整其内容的大小以适应它自己的大小,而不是相反。所以单元格内没有任何东西能够告诉单元格它应该是什么大小。
  • @DonMag 我没有实现它,我不认为我正在为那些添加高度限制,所以也许这就是问题所在?我不在我的电脑附近,但我会尽快检查一下
  • @UpholderOfTruth 那么有什么解决办法吗? DonMag 提到对 stackView 的视图进行高度限制
  • 这完全取决于你想要实现什么样的布局。单元格内的某些东西必须能够定义高度,因此 UIStackView 它本身需要是一个固定高度,或者您可以使用其他东西来代替包含视图。提供UIStackView 的子视图可能不起作用,因为它的目的是调整其子视图的大小以适应自身

标签: ios swift uitableview uikit


【解决方案1】:

下面是在自动调整大小的表格视图单元格内向堆栈视图添加按钮的简单演示:

class StackOfButtonsTableViewCell: UITableViewCell {

    @IBOutlet var theStackView: UIStackView!

    func setup(_ numButtons: Int) -> Void {

        // cells are reused, so remove any previously created buttons
        theStackView.arrangedSubviews.forEach { $0.removeFromSuperview() }

        for i in 1...numButtons {
            let b = UIButton(type: .system)
            b.setTitle("Button \(i)", for: .normal)
            b.backgroundColor = .blue
            b.setTitleColor(.white, for: .normal)
            theStackView.addArrangedSubview(b)
        }

    }

}


class ViewController: UITableViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.rowHeight = UITableViewAutomaticDimension
        tableView.estimatedRowHeight = 100
    }

    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 6
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "StackOfButtonsTableViewCell", for: indexPath) as! StackOfButtonsTableViewCell

        cell.setup(indexPath.row + 1)

        return cell

    }

}

假设您已经创建了一个原型单元格,并且它的唯一内容是一个UIStackView,配置为:

Axis: Vertical
Alignment: Fill
Distribution: Equal Spacing
Spacing: 8

您将 Top/Leading/Trailing/Bottom 限制在单元格的内容视图中,结果如下:

不需要任何高度计算,并且由于按钮确实具有固有大小,因此无需对按钮设置高度限制。

【讨论】:

  • 我遇到的问题与提问者略有不同,但希望获得上下文。感谢详尽的解释,我做到了!谢谢。我需要这部分: // 单元格被重用,所以删除任何以前创建的按钮
猜你喜欢
  • 2015-03-25
  • 2011-03-05
  • 2010-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多