基于 NSSplitViewController 的应用程序几乎从不以正确的大小启动

NSSplitViewController based application almost never launches with the correct size

我有这个应用程序,它使用 NSSplitViewController 作为根,并连接了一个 NSTabViewController 作为它的 detailViewController。

此应用设置为以 1024x768 分辨率启动。左窗格应以 320x768 分辨率启动,右窗格(tabViewController 所在的位置)应以 704x768 分辨率启动。

从我 运行 这个应用程序的 10 次开始,它会以不正确的尺寸(大约 500x500)启动 9 次。另一个奇怪的事情是这个应用程序不应该是可缩放的,但是如果你将鼠标悬停在 window 边界附近你会看到光标指示缩放。

我希望它以正确的大小启动并且没有可扩展选项。

这两个设置都在界面生成器上,但被忽略了。

You can download a sample project that demonstrates the problem, here。停止并 运行 项目几次以查看问题。

我该如何解决?

我不能确定是什么导致了这个问题,但是您可以解决它的一种方法是添加一些约束。 Interface Builder 不允许您限制它插入到拆分视图的左右面板中的默认 NSView 实例,因此您需要添加自己的实例。下面的screen-shot 取自您的演示,但在我完成以下操作后:

  1. 向左拆分添加了一个子视图(我的内容视图),并将其边缘固定到其父视图的边缘(视图Xcode自动添加到拆分视图)
  2. 我的内容视图
  3. 添加了 320 像素的显式宽度限制

当我加载应用程序时,两个拆分都可见,分隔线没有移动,window 无法调整大小。

更新 - 更好的解决方案

虽然约束是解决这个问题的一种方法,但我认为问题的根源在于 Interface Builder 中的一些意外行为。当您将 NSSplitViewController 对象拖到 canvas 上并使其成为 window 控制器的 content window 关系的目标时,split-view 控制器的 view插座实际上没有设置。这样做的一个结果似乎是,当您加载应用程序时,分隔线似乎就在一侧。要解决此问题,请将上述视图出口设置为指向拆分视图:

我已经创建了一个 demo project,其设置与提问者的演示应用程序中的类似。

作为参考,如果 window 内容转场指向 NSTabViewController 场景,也会出现同样的问题。新 windows 打开,尺寸为 500x500。

我通过在我的 window 和我的主选项卡视图控制器之间放置一个带有容器视图的普通视图控制器来解决它。 window 然后将使用容器视图的大小作为初始大小。

以下是我的详细操作:

  1. 向故事板添加了一个新的视图控制器场景
  2. 将视图设置为我希望 window 最初使用的大小
  3. 向新的视图控制器场景添加了容器视图并添加了 4 个约束以使容器完全覆盖视图
  4. 将 window 的内容 segue 连接到新的视图控制器
  5. 最终将容器视图连接到我实际的选项卡视图控制器场景

之前:

[Window Controller Scene] → [Tab View Controller]

之后:

[Window Controller Scene] → [View Controller Scene] → [Tab View Controller]
                             (with Container View)