我有一个垂直包含两个视图的视图。让我们说上视图是A而下视图是B. B水平包含2个视图。让我们说他们是B-1和B-2。 所以它看起来像
|------------------|
| A |
| |
|------------------|
| B | (There is no margin around B-1 and B-2)
||-------||-------||
|| B-1 || B-2 || (B-1 and B-2 has intrinsic content size)
||-------||-------||
|----------------- |
只要B-1和B-2可以显示其内容(通过AutoLayout),我想让A的高度更大。 B-1和B-2的高度可能不同,所以我必须将B的高度设置为两者的较大高度。
我的第一个想法是返回B的内在大小。在B的intrinsicContentSize方法中,我可以计算出哪个大小更大并返回它的大小。
它似乎有效但我感觉有点尴尬,因为如果我添加另一个像B-3的视图,我必须重写代码。 我想写一个干净的AutoLayout约束来满足要求。
AutoLayout有没有更好的解决方案?
答案 0 :(得分:1)
你还没有说过当你有不同的高度时你想要B-1和B-2如何在B内垂直排列。例如,它们可能都是顶部对齐,垂直居中,底部对齐或其他。
无论如何,通常的方法是直接指定规则:
我选择让B-1和B-2顶对齐。这是通过前两个约束实现的。接下来的两个确保B足够高,以显示它们的完整高度。约束5确保B不高于必要的高度。约束条件6到8使A和B垂直相邻并填充超视图。
当然,你也需要横向约束,但我认为你可以处理它。
您应该不让B计算内在内容大小。容器视图的大小不是内在的,它是外在的。它来源于其他东西的大小,而不是它自己的(非视图)内容。
答案 1 :(得分:0)
有两种选择:
在B1和B2之间设置Equal-Heights约束。它们都将采用两个视图之间最大内在高度的高度。
使用一对>=
和==
约束。
对于选项2,==
约束的优先级必须低于>=
约束。例如:
" B"然后将采用B1和B2的最大高度。