由于项目启动的相同原因,我已经开始使用非常酷的新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中仅自动填充不总是对我不利,我可能早就意识到了这一点...