在UILabels列表上设置约束

时间:2016-08-28 15:52:23

标签: ios swift uikit uilabel

我正在尝试使用锚点作为约束来创建UILabel的垂直列表,但由于某种原因,UILabel不会在模拟器中显示。这就是我正在做的事情:

    let propertyNameLabel = UILabel();
    propertyNameLabel.frame = CGRectMake(0,0, 100, 100);
    propertyNameLabel.text = propertyName;
    propertyNameLabel.textColor = UIColor.whiteColor();
    propertyNameLabel.textAlignment = .Center;
    self.addSubview(propertyNameLabel);


    var last_anchor = propertyNameLabel.bottomAnchor;

    for variable in variableList
    {
        let propertyNameLabel_temp = UILabel();
        propertyNameLabel_temp.text = variable;

        propertyNameLabel_temp.textColor = UIColor.whiteColor();
        propertyNameLabel_temp.translatesAutoresizingMaskIntoConstraints = false;
        self.addSubview(propertyNameLabel_temp);

        propertyNameLabel_temp.topAnchor.constraintEqualToAnchor(last_anchor, constant: 10)
        propertyNameLabel_temp.bottomAnchor.constraintEqualToAnchor(last_anchor, constant: 50)

        propertyNameLabel_temp.widthAnchor.constraintEqualToAnchor(self.widthAnchor);

        last_anchor = propertyNameLabel_temp.bottomAnchor;

    }

其中variabeList只是一个变量列表。显示的唯一UILabel是我在顶部明确声明的那个(propertyNameLabel)。我哪里错了?

1 个答案:

答案 0 :(得分:1)

您的代码错误完全。您不能将frame用于propertyNameLabel,也不能将约束用于其他标签。您的标签约束永远不会使标签处于任何类型的水平位置。

将视图视为具有四个特征:x位置,y位置,高度和宽度。您的约束必须明确地确定自动布局中涉及的所有视图的所有四个!否则,你什么也看不见。

Cocoa提供了一些方法,您可以调用这些方法来了解您的约束是否具有模糊(布局不足)。您还可以使用View Debugging。使用提供的工具!不要猜。

以下是创建标签列的实际代码(在superview sv中)。看看必须指定多少才能工作!

    var con = [NSLayoutConstraint]()
    con.appendContentsOf(
        NSLayoutConstraint.constraintsWithVisualFormat(
            "H:|[sv]|",
            options:[], metrics:nil,
            views:["sv":sv]))
    con.appendContentsOf(
        NSLayoutConstraint.constraintsWithVisualFormat(
            "V:|[sv]|",
            options:[], metrics:nil,
            views:["sv":sv]))
    var previousLab : UILabel? = nil
    for i in 0 ..< 30 {
        let lab = UILabel()
        // lab.backgroundColor = UIColor.redColor()
        lab.translatesAutoresizingMaskIntoConstraints = false
        lab.text = "This is label \(i+1)"
        sv.addSubview(lab)
        con.appendContentsOf(
            NSLayoutConstraint.constraintsWithVisualFormat(
                "H:|-(10)-[lab]",
                options:[], metrics:nil,
                views:["lab":lab]))
        if previousLab == nil { // first one, pin to top
            con.appendContentsOf(
                NSLayoutConstraint.constraintsWithVisualFormat(
                    "V:|-(10)-[lab]",
                    options:[], metrics:nil,
                    views:["lab":lab]))
        } else { // all others, pin to previous
            con.appendContentsOf(
                NSLayoutConstraint.constraintsWithVisualFormat(
                    "V:[prev]-(10)-[lab]",
                    options:[], metrics:nil,
                    views:["lab":lab, "prev":previousLab!]))
        }
        previousLab = lab
    }