为什么Xcode只会在设置了另一个约束后抱怨缺少约束

时间:2017-04-09 11:59:50

标签: ios xcode autolayout

帮助我理解:

当您在界面构建器中放置任何视图时,Xcode不会抱怨缺少约束或模糊规则。只有在设置了一些约束(但并非所有约束都消除了歧义)之后, Xcode会通知您缺少约束并建议一些约束。

例如:我为视图设置了一个约束,它在superview中水平居中。现在Xcode抱怨Y位置缺少规则。 为什么它只是从当前的X-Postition中推断出,当你没有任何约束时呢?

2 个答案:

答案 0 :(得分:1)

在您开始使用约束之前,Xcode不知道将在该视图上使用约束,因此它不会显示任何错误。但是一旦添加了约束,它就知道开始应用autoLayout。 Xcode现在需要知道约束中特定视图的宽度,高度,x和y位置。它可以根据应用于其他视图的约束来推断它们,也可以显式定义它们。

此外,您可以使用允许Xcode应用其认为存在的约束的选项。但它们并不总是你想要的。请看下面的图片。 (添加缺少约束按钮)

enter image description here

在您的示例中,您应用了一个约束,指定它应该在X轴方面而不是Y轴方面。要在这种情况下推断约束,您需要有其他视图应用约束,并且此视图应该具有其他约束,这些约束允许它推断其位置。在您的情况下,这发生在X轴和Y轴之间没有关系。只需指定X坐标就不能让autoLayout找出Y坐标。

此外,对于UIView,即使您将其水平和垂直居中,即使这样,它也会显示错误,告诉您定义宽度和高度,前提是它们在视图中没有内容

答案 1 :(得分:1)

那是因为在向视图添加约束之前,Xcode会将其视为您希望视图位于精确的X,Y位置。这意味着无论容器的大小是多少,视图都将始终处于精确的坐标并具有相同的大小。

但是,在添加一些约束之后,这意味着您希望视图根据容器大小(autolayout的用途)更改其大小或位置,因此您添加的约束必须提供足够的Xcode确定其框架的信息。

例如,如果仅添加Horizontally in Container约束而未指定其大小或Y坐标,则Xcode无法分辨您希望放置视图的位置。这就是你收到警告的原因。

至于你提到的例子,如果你将视图设置为在容器中水平居中,随着容器的宽度变大,Xcode无法分辨你喜欢哪一个:

  1. 保持在相同的X位置并增加视图的宽度。
  2. 保留大小并增加X。
  3. 增加容器的高度也会遇到类似的问题。

    希望解释有所帮助:)

    Example Photo