由于项目启动的相同原因,我已经开始使用非常酷的新IOS Swift AutoLayout库:Stevia。但是,我遇到了过多约束的问题。

在以下示例中,我将2个视图的宽度和高度固定为中心,并垂直对齐它们。但是,当我使用视觉格式或可链接的API(下面的第二个代码块)与Stevia一起尝试时,出现冲突

    var constraints = [NSLayoutConstraint]()

    // width
    constraints += NSLayoutConstraint.constraintsWithVisualFormat("[givenTF(300)]",
        options:[], metrics:nil, views:["givenTF":givenTF])
    constraints += NSLayoutConstraint.constraintsWithVisualFormat("[familyTF(300)]",
        options:[], metrics:nil, views:["familyTF":familyTF])

    // center
    constraints += [NSLayoutConstraint(item: givenTF, attribute: .CenterX, relatedBy: .Equal, toItem: view, attribute: .CenterX, multiplier: 1, constant: 0)]

    // vertical alignment
    constraints += NSLayoutConstraint.constraintsWithVisualFormat(
        "V:|-(70)-[givenTF(50)]-(2)-[familyTF(50)]",
        options: .AlignAllCenterX, metrics: nil,
        views: ["givenTF":givenTF, "familyTF":familyTF])

    self.view.addConstraints(constraints)

我尝试过的Stevia视觉格式:
    self.view.layout([
        70,
        givenTF.centerHorizontally().size(300) ~ 50,
        2,
        familyTF.centerHorizontally().size(300) ~ 50
    ])
    // Unable to simultaneously satisfy constraints.

以及Chainable API:
    givenTF.top(70).centerHorizontally().size(300).height(50)
    familyTF.top(122).centerHorizontally().size(300).height(50)
    // Unable to simultaneously satisfy constraints.

我尝试过更改方法调用的顺序。

最佳答案

在调试了冲突的约束之后,我意识到我有两个高度约束。看完Stevia源代码后,我意识到设置width的正确方法不是size()而是width()。大小可同时设置高度和宽度。

 self.view.layout([
     70,
     givenTF.centerHorizontally().width(300) ~ 50,
     2,
     familyTF.centerHorizontally().width(300) ~ 50
 ])

如果在XCode 7中仅自动填充不总是对我不利,我可能早就意识到了这一点...

10-07 16:54