我正在尝试使用锚点作为约束来创建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)。我哪里错了?
答案 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
}