在swift中使用NSLayoutConstraint对齐多个项目

时间:2014-11-01 00:33:41

标签: ios swift nslayoutconstraint

我希望在视图上对齐很多项目。

此代码适用于1个项目:

let control_constraint_ItemAlign = NSLayoutConstraint(item: emailField, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.CenterX, multiplier: 1, constant: 0)

但我想尝试这样的代码:

let control_constraint_ItemAlign = 
NSLayoutConstraint(item:[emailField,passwordField,loginButton],
 attribute: NSLayoutAttribute.CenterX,
 relatedBy: NSLayoutRelation.Equal,
 toItem: self.view,
 attribute: NSLayoutAttribute.CenterX,
 multiplier: 1,
 constant: 0)

或唯一的解决方案是为每个项目写一个约束?

2 个答案:

答案 0 :(得分:2)

您可以遍历视图:

for view in [emailField,passwordField,loginButton] {
    let control_constraint_ItemAlign = 
    NSLayoutConstraint(item:view,
     attribute: NSLayoutAttribute.CenterX,
     relatedBy: NSLayoutRelation.Equal,
     toItem: self.view,
     attribute: NSLayoutAttribute.CenterX,
     multiplier: 1,
     constant: 0)
    self.view.addConstraint(control_constraint_ItemAlign)
}

或者,您可以将适当的选项传递给可视格式语言

答案 1 :(得分:1)

@Patonz - 我收到了这个答案,因为我看到你对已接受答案的评论,我正在寻找一个涉及for-loop + VFL的解决方案。

如果我没有弄错的话,我认为正确的方法是“让它在中心”,而不是试图强迫它集中。

您可以使用循环枚举视图字典,然后插入密钥:

let views = [
  "red": redView,
  "blue": blueView,
  "yellow": yellowView,
]

self.statsView.addConstraints(
  NSLayoutConstraint.constraintsWithVisualFormat(
    "V:|-2-[red(>=10)]-2-[blue(==red)]-2-[yellow(==red)]-2-|", options: nil, metrics: nil, views: views))

for (index, (key, val)) in enumerate(views) {
  self.statsView.addConstraints(
    NSLayoutConstraint.constraintsWithVisualFormat(
      "H:|-60-[\(key)(>=100)]-60-|", options: nil, metrics: nil, views: views))
}

注意>=。只需设置最小值并让自动布局完成其工作(为您扩展/填充剩余空间)。但你可以简单地删除它们并达到同样的效果:

self.statsView.addConstraints(
  NSLayoutConstraint.constraintsWithVisualFormat(
    "V:|-2-[red]-2-[blue(==red)]-2-[yellow(==red)]-2-|", options: nil, metrics: nil, views: views))

for (index, (key, val)) in enumerate(views) {
  self.statsView.addConstraints(
    NSLayoutConstraint.constraintsWithVisualFormat(
      "H:|-60-[\(key)]-60-|", options: nil, metrics: nil, views: views))
}

我使用颜色进行视觉理解,你可以像这样制作你的字典:

let views = [
  "email": emailField,
  "password": passwordField,
  "login": loginButton
]

以下是一个完整示例的要点:https://gist.github.com/damionjn/cd6054c6cae770713615

结果代码:http://cl.ly/image/0z0H2C230H3R