设置具有大于和小于约束的灵活NSView的显式宽度

时间:2014-04-04 23:23:13

标签: cocoa interface-builder autolayout appkit

如何显式设置已经有约束规定其最小宽度和最大宽度的NSView的宽度?

例如,考虑在窗口中嵌入NSSplitView。在拆分视图的左侧窗格中是Inspector,而在右侧窗格中只是一些内容:

---------------------------------
|             |                 | <- NSSplitView
|             |                 |
| Inspector   |  Content        |
|             |                 |
|             |                 |
|             |                 |
---------------------------------

---------------------------------
|                               |
|                               |
|          Content              |
|                               |
|                               |
|                               |
---------------------------------

Inspector有两个限制:

  • width >= 200.0 @ 1000
  • width <= 400.0 @ 1000

分割视图的唯一约束是允许它填充其超视图和Content视图仅作为填充其超级视图的约束(右侧分割窗格)。

创建此视图时,我想将Inspector的初始宽度设置为动态值(可能是保存在用户首选项中的内容)。

但如果我天真地做了类似的事情:

  • width = 320.0 @ 1000

然后拆分视图将不再允许调整该视图的大小。 499749的值也会导致同样的问题。如果我将优先级降低到:

  • width = 320.0 @ 250

然后拆分视图将调整大小,但其初始窗格宽度不是320.0,而是400.0,如Interface Builder中设置的那样。

最终目标是允许Inspector在给定范围内调整大小,但也完全隐藏或折叠(我希望将width设置为{{ 1}},以及0约束到minWidth

我怀疑我可以在0中手动处理这个问题,但我很好奇是否有办法完全通过约束完成此操作。

(注意:大部分布局都是在Interface Builder中完成的,但如果需要,我很乐意以编程方式处理约束.10.8+也很好。)

1 个答案:

答案 0 :(得分:0)

您是否尝试过使用-[NSSplitView setAutosaveName:]让NSSplitView执行保存用户首选项的工作,然后在启动时将其作为初始宽度加载?


如果你不想走这条路,你可以做一些与你的第一直觉非常相似的事情。

添加width = 320.0 @ 1000约束后,您希望布置窗口[window layoutIfNeeded],然后删除该约束。

您的Inspector视图将具有更新的帧,但强制它在那里的约束将会消失,从而允许调整视图的大小。