以编程方式在 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)
我希望 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)