将contentViewController设置为NSTabViewController后,NSWindow启动时的大小错误

时间:2018-01-30 07:37:05

标签: macos nsview nswindow nswindowcontroller nstabviewcontroller

我有一个NSWindowController的Xcode项目,其contentViewController设置为NSViewController的子类。我最近从故事板中删除了NSViewController子类,并将contentViewController替换为NSTabViewController子类。

现在,当我运行应用程序时,NSWindow打开的大小为500x500而不是第一个选项卡的大小。更重要的是,我可以在故事板中看到 no 视图,其大小为500x500,并且该大小也不是以编程方式进行的。窗口本身设置为不同的大小,NSTabViewController的第一个NSViewController中的视图也是如此。

我假设我必须设置某种约束,但如果有,我不知道在哪里/如何找到它。使用Xcode 9.2和High Sierra。

windowDidLoad()编程方式将窗口大小设置为正确的大小,但如果我更改了视图的大小,我也必须更改它,老了,快点。

对不起,如果这是模糊的;我真的不知道哪种屏幕截图或代码片段会有所帮助。

3 个答案:

答案 0 :(得分:3)

我最近遇到了这个令人沮丧的问题。

有几种方法可以解决此问题:

  1. 正如您所提到的,在每个自定义视图控制器中设置preferredContentSize,将标签内容保持为所需大小。这是不灵活的,但确实有效。

    // Swift
    class FooViewController: ViewController {
    
        override func viewWillAppear() {
            super.viewWillAppear()
    
            preferredContentSize = NSSize(width: 400, height: 280)
        }
    }
    
  2. 我在this SO回答中找到了一个更好的解决方案的提示。您可以将子视图(stackview,nsview等)添加到视图控制器的主视图中,该视图处理选项卡的内容(p!),然后添加将其固定到每个边缘的约束并添加设置大小的约束。

  3. 这是Interface Builder中的screenshot。我添加了一个Stack View,然后添加了6个约束。

    希望这有帮助。

答案 1 :(得分:1)

我有类似的问题。我添加了一个带有容器视图的视图控制器作为窗口内容,并将容器视图内容指向选项卡视图控制器。

答案 2 :(得分:0)

约书亚(Joshua)的answer设置了preferredContentSize达到了目的,这一切对他来说都是赞!值得一提的是,由于这是专门针对父选项卡视图控制器完成的,因此最好将其子类化,并将此处理移至tabView(_ tabView: NSTabView, didSelect tabViewItem: NSTabViewItem?)委托方法中,该方法在选择选项卡时会被调用:

override func tabView(_ tabView: NSTabView, didSelect tabViewItem: NSTabViewItem?) {
    tabViewItem?.viewController?.preferredContentSize = tabViewItem?.view?.frame.size
    // Alternatively: tabViewItem?.viewController?.preferredContentSize = tabViewItem?.view?.fittingSize
    super.tabView(tabView, didSelect: tabViewItem)
}

通过这种方式,首选内容的大小始终是最新的,您不必担心手动刷新它,假设,该视图可提供正确的框架大小或合适的大小,这很容易受到限制。

在窗口控制器完成加载以及最初设置500×{500的位置之后,也会调用此方法。

在每个选项卡式视图控制器本身中设置首选的内容大小并不理想:同一代码在多个控制器之间重复,如果在其他位置重复使用这些控制器,则会增加不必要的噪音。