1

在我看来,我将拥有这样的动态 UILabel 数量:

| HEADER  |
| - label |
| - label |
| - label |
| ...     |
| BUTTON  |

由于标签的动态数量,我正在为代码中的每个元素构建带有约束的布局(使用 Snap Kit)。假设我有一个字符串数组,为数组中的每个字符串创建单独的标签,添加到 superview 并将其放置在前一个的下方。但是我不确定如何正确设置这些标签的约束?我相信我需要编写for循环,但是如何指示第一个标签贴在标题上,每个旁边贴上一个标签,最后下面的按钮贴在最后一个标签上?

    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)
    }

这是我第一次在代码中编写所有约束,如果这听起来像个愚蠢的问题,很抱歉。感谢帮助。

4

2 回答 2

1

您可以在for循环之前声明一个变量来跟踪当前的顶视图。一开始它会指向 header,然后在循环中的每次迭代中更新它:

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)

于 2016-11-23T16:02:39.467 回答
0

使用垂直堆栈视图。它会让你的生活更轻松(这里的 UIStackView 文档)

于 2016-11-23T15:49:23.090 回答