gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 18:39:15 45 4
gpt4 key购买 nike

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

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

Storyboard Layout

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

Autolayout Constraints

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

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

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

Revised Autolayout constraints

必须有一种方法来实现这一点,但我只是对如何做到这一点感到困惑。请帮忙!

更新

这是 NSSplitViewController View 的约束影响布局ForOrientation 的输出:

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

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

最佳答案

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

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

因此,您应该寻找优先级高于 500 的约束,以尝试将其缩小。例如,内容拥抱控件的优先级。另一种可能性是分割 View 项的持有优先级。如果这些值高于 500 并且从 Storyboard加载的 View 的初始大小是最小的,那么我希望拆分 View 更愿意将它们保持在这些大小,而不是窗口更愿意保持其大小。

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

关于macos - 如何使用自动布局设置 NSSplitView 面板的最小和初始宽度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30315671/

45 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com