如何使用Masonry DSL更新约束?

时间:2015-02-07 10:36:30

标签: ios swift nslayoutconstraint

我在updateConstraints中使用Masonry在代码中创建自动布局约束:

我在控制台日志中获得以下内容:

Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSLayoutConstraint:0x7f8eabc684e0  Demo.View1:0x7f8eabc34680.top == Demo.View2:0x7f8eabc3ef20.bottom + 10>",
    "<MASLayoutConstraint:0x7f8eabc39420 Demo.View1:0x7f8eabc34680.top == Demo.View2:0x7f8eabc3ef20.bottom + 40>"
)

Will attempt to recover by breaking constraint 
<MASLayoutConstraint:0x7f8eabc39420 Demo.View1:0x7f8eabc34680.top == Demo.View2:0x7f8eabc3ef20.bottom + 40>

为什么它没有更新约束?

更新

BTW:我正在使用故事板。

2 个答案:

答案 0 :(得分:2)

这里的错误消息提供了很好的建议

  

以下列表中的至少一个约束可能是一个   你不想要。试试这个:(1)看看每个约束并尝试   找出你不期望的; (2)找到添加的代码   不需要的约束或约束并修复它。

并帮助打印出来

"<NSLayoutConstraint:0x7f8eabc684e0  Demo.View1:0x7f8eabc34680.top == Demo.View2:0x7f8eabc3ef20.bottom + 10>"
"<MASLayoutConstraint:0x7f8eabc39420 Demo.View1:0x7f8eabc34680.top == Demo.View2:0x7f8eabc3ef20.bottom + 40>"

注意两个约束和对象引用之间的相似性

view1的顶部应低于view2的底部10或40。不能两个都这么一个?当您使用Masonry时,我怀疑它是您想要的MASLayoutConstraint

找出NSLayoutConstraint的来源。它不是一个自动化的,因为它们在它们中有波浪形。所以要么你把它放在你的代码中,要么它来自XIB / Storyboard。

你可以在Xcode中使用正则表达式查找,如果它是前者,它会更容易。我可能试试这个。

通过搜索图标点击披露。您可以插入各种模式。

enter image description here

我可能会将此作为首发

enter image description here

答案 1 :(得分:0)

您没有向我们展示您的约束,因此很难说出错误。

我不知道为什么但你不能用multipliedBy这样的相对值来更新约束。你可以做的是将约束更新为常量。并且您可以相对于屏幕尺寸计算常数。像这样:

 _height_y = -self.view.frame.size.height*0.25;
[_phoneField updateConstraints:^(MASConstraintMaker *make) {
    make.baseline.equalTo(self.view.centerY).with.offset(_height_y);
}];