自动布局正在做一些对我没有意义的事情,但希望对你们其中一人:
我有一个UIView containerView和5个UIViews coverview1-coverview5。 我想在containerView中将这5个封面视图放在一起:相同的宽度,相同的底部对齐,任何地方都没有间距,如| [__] [__] [__] [__] [__] |
所以我在做:
[coverviewContainer addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:
@"H:|[coverview1(>=0)][coverview2(==coverview1)][coverview3(==coverview1)][coverview4(==coverview1)][coverview5(==coverview1)]|" options:NSLayoutFormatAlignAllBottom metrics:nil views:viewsDictionary]];
我得到了:
Unable to simultaneously satisfy constraints.
(
"<NSLayoutConstraint:0x1d5ae4f0 ItemView:0x1d58f6f0.centerX == ItemView:0x1d580410.centerX>",
"<NSLayoutConstraint:0x1d5ae470 ItemView:0x1d58f6f0.centerX == ItemView:0x1d59b480.centerX>",
"<NSLayoutConstraint:0x1d5aed70 ItemView:0x1d580410.centerX == ItemView:0x1d59b480.centerX>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x1d5ae470 ItemView:0x1d58f6f0.centerX == ItemView:0x1d59b480.centerX>
奇怪的是,如果我执行以下任何操作,我不会收到警告:
[coverviewContainer addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:
@"H:|[coverview1(>=0)]|" options:NSLayoutFormatAlignAllBottom metrics:nil views:viewsDictionary]];
//or
[coverviewContainer addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:
@"H:|[coverview1(>=0)][coverview2(==coverview1)]|" options:NSLayoutFormatAlignAllBottom metrics:nil views:viewsDictionary]];
//or
[coverviewContainer addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:
@"H:|[coverview1(>=0)][coverview2(==coverview1)][coverview3(==coverview1)]|" options:NSLayoutFormatAlignAllBottom metrics:nil views:viewsDictionary]];
//or
[coverviewContainer addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:
@"H:|[coverview1(>=0)][coverview2(==coverview1)][coverview3(==coverview1)][coverview4(==coverview1)]|" options:NSLayoutFormatAlignAllBottom metrics:nil views:viewsDictionary]];
//or
[coverviewContainer addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:
@"H:|[coverview1(>=0)][coverview2(==coverview1)][coverview3(==coverview1)][coverview5(==coverview1)]|" options:NSLayoutFormatAlignAllBottom metrics:nil views:viewsDictionary]];
(最后两个不一样,因为我用coverview5替换了coverview4)
为什么我最多只能添加4个视图? 为什么添加第5个会导致视图centerX对齐突然出现问题?
答案 0 :(得分:2)
错误消息中有一个很好的提示:
无法同时满足约束条件。
因此,研究约束中的约束显示:
"<NSLayoutConstraint:0x1d5ae4f0 ItemView:0x1d58f6f0.centerX == ItemView:0x1d580410.centerX>",
"<NSLayoutConstraint:0x1d5ae470 ItemView:0x1d58f6f0.centerX == ItemView:0x1d59b480.centerX>",
"<NSLayoutConstraint:0x1d5aed70 ItemView:0x1d580410.centerX == ItemView:0x1d59b480.centerX>"
我们可以看到有两个约束在ItemView
实例0x1d58f6f0
上指定相同的内容。第一个说明centerX
应该与ItemView
实例0x1d580410
centerX
相同。
第二个说明centerX
应该与ItemView
实例0x1d59b480
centerX
相同。
因此,我们有两个相互矛盾的约束。他们都试图告诉ItemView
把它放在水平中心的位置,他们都给出了不同的指示。想想两个人同时对你大喊大叫,告诉你站在两个不同的地方。
自动布局运行时最好处理此问题。两个相互矛盾的约束?忽略其中一个。在这种情况下,它会忽略或“中断”约束0x1d5ae470
。
你的其他限制措施怎么样?为什么他们使用四个视图而不是五个视图?我们必须考虑Auto Layout运行时将根据您的意愿尝试在容器视图中布置视图。有四个视图,它可以做你想要的。有五个视图,它尝试来做你想做的事情,然后失败。这取决于所设置的约束。如果视图必须水平连续对齐,那么可以根据容器视图的大小来完成吗?如果没有,您将需要水平宽度约束,允许ItemView
宽度减少,以便五个可以很好地组合在一起。
要考虑的另一件事是,您是否以编程方式创建了这些视图coverview1
到coverview5
,或者是否在Xib中设置了这些视图。两者都有问题。如果以编程方式添加它们,则需要将translatesAutoresizingMaskIntoConstraints
标志设置为NO
,以防止默认情况下添加自动调整约束,并且无疑会与您设置的约束冲突。
或者,如果您在Xib中创建了这些视图,则需要以编程方式删除Interface Builder强加给您的任何现有约束。否则,这些可能与您使用可视化格式语言以编程方式添加的内容相冲突。