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

ego6inou  于 2022-11-06  发布在  Swift
关注(0)|答案(2)|浏览(292)

我希望有一个与<Table> HTML标记类似的行为,即根据其内容调整框架的大小。
在我的上下文中,我使用UIStackView作为UITableViewCell的内容视图。由于单元格中的项是各种信息,因此单元格的最终高度应该是可变的。
我的策略是以编程方式构建一个单元格作为具有.Vertical轴的UIStackView,如下面的代码片段所示:

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
}

我该怎么补救呢?

tyg4sfes

tyg4sfes1#

UIStackView设计为根据内容增加其大小。为了使其工作,您需要在UIStackViewUITableViewCell之间设置约束。例如,如果UIStackView是第一项,UITableViewCell是它的超级视图,那么界面构建器中的约束如下所示:
第一次
如果您喜欢在代码中设置约束条件,那也应该可以。
例如,假设名称为stackViewcellView,则上述约束的Swift代码将如下所示:

stackView.translatesAutoresizingMaskIntoConstraints = false
stackView.topAnchor.constraint(equalTo: cellView.topAnchor, constant: 0).isActive = true
stackView.bottomAnchor.constraint(equalTo: cellView.bottomAnchor, constant: 0).isActive = true
stackView.leadingAnchor.constraint(equalTo: cellView.leadingAnchor, constant: 0).isActive = true
stackView.trailingAnchor.constraint(equalTo: cellView.trailingAnchor, constant: 0).isActive = true

为了证明这是可行的,我在cellForRowAt函数中使用了这个函数。基本上,它将一个UILabel的数字放入UIStackView中,标签计数取决于行号。

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

wfauudbj

wfauudbj2#

我构建了这个示例,希望它能有所帮助,我创建了一个tableView,它使用了一个包含stackView的单元格,而stackView中加载的视图是从nib文件中获取的
https://github.com/Joule87/stackView-within-TableViewCell

相关问题