OSX:如何允许用户在自动布局下调整窗口大小?

时间:2015-03-10 07:03:46

标签: macos cocoa autolayout

我有一个NSWindow,有一些观点,与自动布局约束相结合。

窗口看起来像这样...

Label - TextView - Label - TextView - Label - DatePicker

Label - TextView - Label - PopUp - Label - PopUp

弹出窗口的数据是通过绑定到核心数据获得的,因此直到运行时才知道这些值。我希望调整这些控件以适应数据库中的值。

从表面上看,一切似乎都很好。但是,如果我在弹出控件中以一个非常长的字符串结束,那么该控件的大小会导致窗口的大小扩展。

我希望大小是动态的,并根据数据的值进行更改,但我希望将约束限制为窗口的大小。

但是,我希望用户能够调整窗口大小,如果他们想让它更宽。我只希望用户调整窗口大小(窗口大小将自动保存和恢复)。

如果我在窗口的主视图上设置拥抱值,我会得到它,但这似乎也阻止了用户也能够调整窗口的大小。如果我降低控件约束的优先级,我就不会得到我想要的大小和位置。

所以,基本上,我希望控件随窗口大小的变化而变化,但我不希望窗口的大小发生变化,除非用户更改它。我怎样才能实现这一目标?

谢谢!

1 个答案:

答案 0 :(得分:5)

您需要将视图的内容拥抱和抗压缩优先级更改为小于NSLayoutPriorityWindowSizeStayPut(500)。

如果内容拥抱优先级高于此值,那么窗口将无法调整大小以至于这些视图会被拉伸。如果压缩阻力优先级高于此值,那么窗口将无法调整大小以至于这些视图会被压缩。

你说" [i] f [you]降低控件的优先级'约束,[你]不会像[你]想要的那样得到尺寸和位置"。什么打破了?即使内容拥抱和压缩阻力优先级降低,您也需要找到实现目标的方法。

您可能还希望对视图设置最小宽度限制,以防止窗口将其压缩为空。总的来说,这样的约束将确定窗口的最小尺寸(您可能 想要的那样)。

此外,您可能希望视图中的优先级不同,否则您会产生歧义和某种随意的结果。也就是说,如果用户缩小窗口以使一切都不适合,并且如果两个或更多个视图具有相同的抗压缩优先级,那么它将是任意的被压缩的。随着进一步的变化,它甚至可以令人不安地来回翻转。因此,您应该通过命令压缩阻力优先级来有效地指定哪个应首先压缩,然后压缩第二个等。同样适用于内容拥抱。