【问题标题】:How to set NSSplitView panels minimum & initial width using auto layout?如何使用自动布局设置 NSSplitView 面板的最小和初始宽度?
【发布时间】:2015-07-30 16:38:50
【问题描述】:

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

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

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

这一切都很好。当窗口打开时,窗口宽度是两个面板的最小宽度约束之和。我想不通的是下一步。

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

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

必须有一种方法来实现这一点,但我只是不知道怎么做。请帮忙!

更新

这是 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 )>]

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

【问题讨论】:

    标签: macos autolayout osx-yosemite xcode-storyboard


    【解决方案1】:

    您不必添加额外的约束来强制执行此操作。默认情况下,窗口将具有它在情节提要中配置的大小。如果它越来越小,则表明存在迫使它变小的限制。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-27
      • 1970-01-01
      • 2016-03-09
      • 2012-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多