以编程方式在 stackView 中布置子视图

Programatically laying out subviews in a stackView

我希望 UITableCell 包含可变数量的按钮,例如 "Yes" 和 "No" 按钮,或者 "Red"、"Green" 和 "Blue" 纽扣。我尝试了各种方法,但最终决定在单元格中使用垂直 stackView 并以编程方式添加包含按钮的视图(请随时在此处提出更好的方法)。

我遇到的问题是我不知道自动布局在做什么。通常,当您在界面构建器中将视图添加到 stackView 时,您只需要一个高度值,然后它们就会很好地堆叠。然而,下面的代码似乎给他们一个零宽度,如果我设置宽度,视图都在彼此之上。请注意,这不包括我上面提到的使响应更容易的按钮;我刚刚添加了两个视图。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "formQuestion") as! FormQuestionTableViewCell
    let view = UIView(frame: .zero)
    view.backgroundColor = UIColor.red
    view.translatesAutoresizingMaskIntoConstraints = false
    cell.questionOptions.addSubview(view)
    NSLayoutConstraint.activate([
        view.heightAnchor.constraint(equalToConstant: 8)
        // , view.widthAnchor.constraint(equalToConstant: 16)
    ])
    let view2 = UIView(frame: .zero)
    view2.backgroundColor = UIColor.blue
    view2.translatesAutoresizingMaskIntoConstraints = false
    cell.questionOptions.addSubview(view2)
    NSLayoutConstraint.activate([
        view2.heightAnchor.constraint(equalToConstant: 32)
        // , view2.widthAnchor.constraint(equalToConstant: 64)
    ])
    return cell
}

为了完整起见,FormQuestionTableViewCell 看起来像这样...

class FormQuestionTableViewCell: UITableViewCell {

    @IBOutlet weak var descriptionContainer: UIView!
    @IBOutlet weak var controlContainer: UIView!
    @IBOutlet weak var descriptionLabel: UILabel!
    @IBOutlet weak var questionOptions: UIStackView!

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)!
    }
}

启用宽度限制后看起来像这样(尽管我认为这不是必需的)...

如果您能给我任何帮助,我们将不胜感激!

这是错误的:

cell.questionOptions.addSubview(view)

添加子视图到UIStackView时,您应该使用:

.addArrangedSubview()

参考:

https://developer.apple.com/documentation/uikit/uistackview/1616227-addarrangedsubview

你说的是

cell.questionOptions.addSubview(view)

错了。 questionOptions 是堆栈视图。如果你想让它负责布局view,你必须说

cell.questionOptions.addArrangedSubview(view)