0

前提

我有一个超级视图 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 填写了 superview 的其余部分。随着 A 的增长,B 被向下推。

问题

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

界面生成器

我已经尝试实现超级视图updateConstraints来删除这个 IB 生成的约束。那种工作,但是当我这样做时,B的顶部从未调整过,似乎是任意设置的。不管我将约束优先级设置为什么,B 最终都位于 C 的底部、顶部或远离屏幕的某个位置。此外,A 似乎增长到填满整个 C。

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

界面生成器

额外细节

我应该补充一点,C 是基于视图的单元格视图NSTableView。我计算了适合 A 和 B 所需的高度tableView:heightOfRow,并期望约束能够将所有内容都布置好。

4

1 回答 1

1

后人的答案:在约束条件下显然不可能进行描述的配置。到目前为止,我的解决方案有效:

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