2016-11-23 37 views
1

在我看来,我将不得不这样UILabels的动态数量的动态数:在代码中设置约束元素

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

我建立布局约束在代码中的每一个元素(使用捕捉工具包) ,因为标签的动态数量。比方说,我有一个字符串数组,对于数组中的每个字符串,我创建单独的标签,将其添加到超级视图并将其放置在前一个之下。不过,我不知道如何正确设置这些标签的约束?我相信我需要编写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) 
    } 

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

回答

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循环中,您将简单地添加标签0123'

+0

谢谢。很简单。 – Bastek

0

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