如何在AutoLayout

时间:2015-10-17 22:14:54

标签: objective-c macos cocoa autolayout

我有一个垂直包含两个视图的视图。让我们说上视图是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有没有更好的解决方案?

2 个答案:

答案 0 :(得分:1)

你还没有说过当你有不同的高度时你想要B-1和B-2如何在B内垂直排列。例如,它们可能都是顶部对齐,垂直居中,底部对齐或其他。

无论如何,通常的方法是直接指定规则:

  1. B.top == B1.top
  2. B.top == B2.top
  3. B1.bottom< = B.bottom
  4. B2.bottom< = B.bottom
  5. B.height == 0 @ priority 200
  6. superview.top == A.top
  7. A.bottom == B.top
  8. B.bottom == superview.bottom
  9. 我选择让B-1和B-2顶对齐。这是通过前两个约束实现的。接下来的两个确保B足够高,以显示它们的完整高度。约束5确保B不高于必要的高度。约束条件6到8使A和B垂直相邻并填充超视图。

    当然,你也需要横向约束,但我认为你可以处理它。

    您应该让B计算内在内容大小。容器视图的大小不是内在的,它是外在的。它来源于其他东西的大小,而不是它自己的(非视图)内容。

答案 1 :(得分:0)

有两种选择:

  1. 在B1和B2之间设置Equal-Heights约束。它们都将采用两个视图之间最大内在高度的高度。

  2. 使用一对>===约束。

  3. 对于选项2,==约束的优先级必须低于>=约束。例如:

    • B1:容器的顶部空间== 0 @ 250 priority
    • B1:容器的顶部空间> = 0 @ 1000优先级
    • B2:容器的顶部空间== 0 @ 250 priority
    • B2:容器的顶部空间> = 0 @ 1000优先级

    " B"然后将采用B1和B2的最大高度。