如何设置NSSplitView面板最小和最小使用自动布局的初始宽度?

时间:2015-05-19 02:14:59

标签: macos autolayout osx-yosemite xcode-storyboard

我是OS X可可开发的新手,正在使用Storyboard for Yosemite开发Swift应用程序。

在我的应用程序的主窗口中,我有一个NSSplitViewController。对于左侧和右侧的每个面板,我添加了一个包含所有子视图的根自定义视图。

Storyboard Layout

使用自动布局,我已将自定义视图固定到拆分视图中视图的边缘,并且还定义了自定义视图宽度的约束大于或等于最小数量。

Autolayout Constraints

一切正常。窗口打开时,窗口宽度是两个面板的最小宽度约束的总和。我无法弄清楚的是下一步。

如何为自定义视图提供另一个宽度约束,以便在窗口打开时,它的初始宽度高于最小宽度(比方说300)?我想要的是面板可以小到200,但我希望初始尺寸为300.我不希望窗口以允许的最小宽度打开。然后,用户每次都必须调整大小,这不是一个好的用户体验。

为了尝试实现这一点,我为自定义视图添加了另一个具有较低优先级(尝试所有不同值200,500,800等)的300的宽度约束,但它们都没有给我所需的宽度结果值为300,面板最小宽度为200.

Revised Autolayout constraints

必须有一种方法可以实现这一目标,但我只是难以理解。请帮忙!

更新

以下是NSSplitViewController视图的constraintsAffectingLayoutForOrientation的输出:

<NSLayoutConstraint:0x6000000923e0 H:|-(0)-[NSView:0x600000124c40]   (Names: '|':NSView:0x600000124ba0 )>, 
<NSLayoutConstraint:0x6000000924d0 H:[NSView:0x600000124c40]-(0)-|   (Names: '|':NSView:0x600000124ba0 )>, 
<NSLayoutConstraint:0x600000092070 H:[NSView:0x600000124c40(>=200)]>, 
<NSLayoutConstraint:0x600000092660 _NSSplitViewItemViewWrapper:0x6000001416b0.width == NSView:0x600000124ba0.width>, 
<NSLayoutConstraint:0x600000093a10 H:|-(0)-[_NSSplitViewItemViewWrapper:0x6000001416b0](LTR)   (Names: '|':NSSplitView:0x608000123b60 )>, 
<NSLayoutConstraint:0x600000093b50 H:[_NSSplitViewItemViewWrapper:0x6000001416b0]-(1)-[_NSSplitViewItemViewWrapper:0x6000001429f0](LTR)>, 
<NSAutoresizingMaskLayoutConstraint:0x600000093d80 h=-&- v=-&- H:[NSSplitView:0x608000123b60]-(0)-|   (Names: '|':NSView:0x6000001242e0 )>, 
<NSAutoresizingMaskLayoutConstraint:0x600000093b00 h=-&- v=-&- H:|-(0)-[NSSplitView:0x608000123b60]   (Names: '|':NSView:0x6000001242e0 )>, 
<NSAutoresizingMaskLayoutConstraint:0x600000094050 h=-&- v=-&- H:|-(0)-[NSView:0x6000001242e0]   (Names: '|':NSThemeFrame:0x100940be0'Main Window' )>, 
<NSLayoutConstraint:0x600000093c40 H:[_NSSplitViewItemViewWrapper:0x6000001429f0]-(0)-|(LTR)   (Names: '|':NSSplitView:0x608000123b60 )>, 
<NSLayoutConstraint:0x600000092890 H:[NSView:0x600000124f60]-(0)-|   (Names: '|':NSView:0x600000124ec0 )>, 
<NSLayoutConstraint:0x6000000926b0 H:[NSView:0x600000124f60(>=400)]>, 
<NSLayoutConstraint:0x608000099d20 _NSSplitViewItemViewWrapper:0x6000001429f0.width == NSView:0x600000124ec0.width>, 
<NSLayoutConstraint:0x600000092840 H:|-(0)-[NSView:0x600000124f60]   (Names: '|':NSView:0x600000124ec0 )>]

由于要进行排序的大量限制因素,我决定制作一个全新的测试项目,看看这是开箱即用的,还是我在应用程序中更改的设置。在测试项目中,我刚刚删除了视图控制器,在窗口中添加了一个拆分视图控制器,并为每个面板添加了两个简单的文本视图。然后运行项目,左侧​​面板折叠。所以我为每个文本视图添加了一个最小宽度约束,然后在测试项目中发生了同样的事情。无论我在故事板中设置什么,窗口大小都是最小宽度的增加。也许唯一的方法是在代码中设置窗口/拆分视图大小。

1 个答案:

答案 0 :(得分:6)

您不必添加其他约束来强制执行此操作。默认情况下,窗口将具有在故事板中配置的大小。如果它变得越来越小,这表明有一些限制迫使它变小。

窗口将其大小保持在优先级500(NSLayoutPriorityWindowSizeStayPut)。较高优先级的约束可以将其推或拉到不同的大小。窗口的当前大小将覆盖优先级较低的约束。

因此,您应该寻找优先级高于500的约束,试图将其拉得更窄。例如,内容拥抱控件的优先级。另一种可能性是拆分视图项的保持优先级。如果那些高于500并且从故事板加载的视图的初始大小是最小的,那么我希望拆分视图更愿意将它们保持在那些大小比窗口更愿意保持它的大小。

可能有用的诊断技术是记录[someView constraintsAffectingLayoutForOrientation:NSLayoutConstraintOrientationHorizontal]。您可以为窗口的contentView或拆分视图执行此操作。