我尝试以编程方式更改视图的自动布局约束(我将其命名为FOO视图),但我无法做到。我弄清楚这样做的方法是枚举viewController的主视图的所有约束(我将它命名为Main view)。
我的问题是,为什么约束与主视图相关联,而不是与FOO视图相关?
答案 0 :(得分:1)
如果约束对其超级视图具有相对约束,则其约束将在superview ..,
中如果约束与固定宽度或高度不相似,那么它们就在视图中......
其背后的原因是苹果设计的如此......:)
答案 1 :(得分:0)
Er. Khatri's answer是正确的。它是Apple的约定/定义,只有他们的工程师才能肯定回答您的问题。但是,我想添加一个非常合理的解释,补充定义添加约束的视图的规则:
仅包含来自单个视图的布局属性的约束将直接添加到该视图。
view1.width = 50
view1.height = 100
view1.width = view1.height
view1.width = 0.5 * view1.height
超级视图中包含一个视图中的布局属性和超级视图中的另一个布局属性的约束。
view1.leading = view2.trailing + 8
view1.bottom = view2.bottom - 8
包含来自两个不同视图的布局属性的约束(其中不包含另一个的超级视图)会被添加到其第一个公共超级视图中。
label1.baseline = label2.baseline
有两个原因(我可以想到,也许Apple有更多理由):
<强>可信度:强>
宽度,高度和宽高比是单个视图的内在属性。它们与任何其他视图无关。因此,这个特定视图拥有这些约束是有道理的。另一方面,当您将两个视图的位置相互关联时,这些约束将被共享&#34;意见之间。不清楚哪个视图本身应该具有这些约束。因此,为了避免混乱,我们需要一个可靠的规则来选择作为约束的所有者。上述规则毫不含糊。
布局引擎的便利性:
约束从上到下解析(即从superview到subview)。因此,当怀疑&#34;怀疑&#34;时,总是在视图层次结构中向视图添加约束是合理的。这对于布局引擎来说也很方便,因为当它布置特定视图的子视图时,它已经有了这些约束,并且不需要询问其子视图的约束(其他比大小和宽高比限制)。