如何根据内容调整 UIStackView 的大小?

Posted

技术标签:

【中文标题】如何根据内容调整 UIStackView 的大小?【英文标题】:How to size a UIStackView depending on its content? 【发布时间】:2016-08-04 03:03:54 【问题描述】:

我希望有一个与<Table> html 标记类似的行为,即框架根据其内容调整大小。

在我的上下文中,我使用 UIStackView 作为 UITableViewCell 的内容视图。由于单元格中的项目是各种信息,因此单元格的结果高度应该是可变的。

我的策略是以编程方式将单元格构建为具有 .Vertical 轴的 UIStackView,如代码 sn-p 中所示:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 

    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)

    let sv = UIStackView(frame: tableview.frame)
    sv.axis = .Vertical
    cell.addSubview(sv)
    for i in information 
        let l = UILabel()
        l.text = i
        sv.addSubViewAndArrange(l)
    

    return cell

很遗憾,单元格大小没有根据内容调整,因​​此我必须自己设置单元格高度,如下:

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat 
    return cellHeight     // a constant

我该如何解决这个问题?

【问题讨论】:

我认为您应该使用单元格适当地限制您的 stackView 以使这种方法起作用。 我已经测试了这条路径(向单元格添加了 sv T-T、L-L、R-R、B-B 约束),但这会导致单元格超宽(一次只能看到一个单元格)。 @zcui93 StackView 本身应该受到单元格的约束,以便单元格随之增长。然后设置子视图,以便 StackView 将根据它们的“内在内容大小”正确增长 【参考方案1】:

UIStackView 旨在根据内容扩大其大小。为此,您需要在UIStackViewUITableViewCell 之间设置约束。例如,这是约束在界面生成器中的样子:

如果您喜欢在代码中设置约束,那也应该可以。

为了证明这将起作用,我为cellForRowAt 函数提供了这个。基本上,它会在UIStackView 中放置一些UILabel,并且标签计数取决于行号。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: "TableviewCell", for: indexPath) as! TableviewCell
    for i in 1...indexPath.row + 1 
        let label = UILabel()
        label.text = "Row \(indexPath.row), Label \(i)"
        cell.stackView.addArrangedSubview(label)
    
    return cell

这是最终结果:

https://github.com/yzhong52/AutosizeStackview

【讨论】:

【参考方案2】:

我构建了这个示例,希望对您有所帮助,我创建了一个 tableView,它使用一个包含 stackView 的单元格,并且在 stackView 中加载的视图是从一个 nib 文件中获取的

https://github.com/Joule87/stackView-within-TableViewCell

【讨论】:

以上是关于如何根据内容调整 UIStackView 的大小?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Xcode 中调整 UIStackView 的子视图大小?

如何使用 UIStackView 按比例调整大小?

带有 2 个 UILabel 的 UIStackview 可以根据内容动态调整吗?

如何根据内容动态制作 Swift UIStackView 大小?

为啥 UIStackView 调整排列的子视图的大小?

查找由 UIStackView swift 调整的视图的大小