在我看来,我将拥有像这样的动态数量的UILabel:
| HEADER |
| - label |
| - label |
| - label |
| ... |
| BUTTON |
由于动态的标签数量,我正在为代码中的每个元素构建布局(使用Snap Kit)。让我们说我有一个字符串数组,对于数组中的每个字符串,我创建单独的标签,添加到superview并将其定位在前一个下面。但是我不确定如何正确设置这些标签的约束?我相信我需要编写for-loop,但是如何指示第一个标签贴在标题上,每个标签都贴在前一个标签上,最后下面的按钮贴在最后一个标签上?
header.snp.makeConstraints { (make) -> Void in
make.top.equalTo(self.view).offset(10)
make.leading.equalTo(self.view).offset(10)
make.trailing.equalTo(self.view).offset(10)
}
for object in objects {
let label = UILabel()
label.text = object
self.view.addSubview(label)
// and here how to set correct constraints for each label?
}
button.snp.makeConstraints { (make) -> Void in
make.leading.equalTo(self.view).offset(10)
make.trailing.equalTo(self.view).offset(10)
make.bottom.equalTo(self.view).offset(10)
}
这是我第一次在代码中编写所有约束,很抱歉,如果这听起来像是一个愚蠢的问题。谢谢你的帮助。
答案 0 :(得分:1)
您可以在for
循环之前声明变量以跟踪当前的顶视图。在开始时,它将指向标题,然后在循环中的每次迭代中更新它:
var topView = header
for object in objects {
let label = UILabel()
label.text = object
self.view.addSubview(label)
// and here are your constraints
label.top.equalTo(topView).offset(10)
label.left.equalTo(self.view).offset(20)
// topView is now the current label
topView = label
}
button.snp.makeConstraints { (make) -> Void in
make.leading.equalTo(self.view).offset(10)
make.trailing.equalTo(self.view).offset(10)
make.top.equalTo(topView).offset(10)
make.bottom.equalTo(self.view).offset(10)
}
如果你的标签有相同的间距,那么更优选的方法是尝试UIStackView。你声明一个堆栈视图,为它指定约束,然后在for循环中,你只需要stackView.addArrangedSubview(label)
答案 1 :(得分:0)
使用垂直堆栈视图。它会让你的生活更轻松 (UIStackView docs here)