两个动态调整大小视图之间的Autolayout约束

时间:2013-02-02 21:49:36

标签: objective-c cocoa interface-builder

前提

我有一个superview C,它只包含两个子视图A和B. ASCII艺术:

+-----------+
|   view A  |
|   view B  |
+-----------+

这就是我想要的:

  • A的顶部必须固定在C的顶部。 A的高度不固定在任何东西上;它实际上会根据其内容而改变:它是一个无滚动视图的NSTextView

  • B的顶部必须始终距离A的底部10个像素。 B的底部必须始终固定在C的底部。

整个视图C应该在A和B之间分开,A和B之间的划分必须由A的当前高度(由NSTextView决定)决定,B应该填充任何A未占用的剩余空间。

换句话说:A停留在顶部。 B填写其余的超级视图。随着A的增长,B被推向下方。

问题

Interface Builder始终创建不可删除的约束,使B的顶部位于C顶部。这意味着B将始终位于特定的Y位置。如果我给B一个高度约束,这不会发生,但这不是我想要的。

Interface Builder

我已尝试实施superview的updateConstraints来删除此IB生成的约束。这样的作品,但是当我这样做时,B的顶部从未调整过,似乎是任意设定的。我设置约束优先级并不重要,B最终定位在C的底部,或顶部,或远离屏幕的某个地方。此外,A似乎越来越多地填满了整个C.

这是我无法摆脱的自动创建的约束:

Interface Builder

其他详情

我应该补充一点,C是基于视图的NSTableView中的单元格视图。我计算了tableView:heightOfRow中适合A和B的所需高度,并期望将约束放在一边。

1 个答案:

答案 0 :(得分:1)

后代的答案:有一个像所描述的配置显然不可能有约束。到目前为止,我的解决方案有效:

  • 在A上创建一个设置特定高度的约束。 (在IB中,我设置了一个虚拟高度。)
  • 在B上创建一个设置特定顶部的约束。
  • 不要指定A和B之间的垂直间距。(至少在我的情况下,这会在NSTableView中触发奇怪的行为。)
  • 在您的控制器或视图代码中,计算A的高度并使用constraint.constant属性进行设置。
  • 同样在您的控制器或视图代码中,计算出B的顶部(使用A的高度)并使用constraint.constant属性进行设置。