我有一个NSWindowController
的Xcode项目,其contentViewController
设置为NSViewController
的子类。我最近从故事板中删除了NSViewController
子类,并将contentViewController
替换为NSTabViewController
子类。
现在,当我运行应用程序时,NSWindow
打开的大小为500x500而不是第一个选项卡的大小。更重要的是,我可以在故事板中看到 no 视图,其大小为500x500,并且该大小也不是以编程方式进行的。窗口本身设置为不同的大小,NSTabViewController
的第一个NSViewController
中的视图也是如此。
我假设我必须设置某种约束,但如果有,我不知道在哪里/如何找到它。使用Xcode 9.2和High Sierra。
以windowDidLoad()
编程方式将窗口大小设置为正确的大小,但如果我更改了视图的大小,我也必须更改它,老了,快点。
对不起,如果这是模糊的;我真的不知道哪种屏幕截图或代码片段会有所帮助。
答案 0 :(得分:3)
我最近遇到了这个令人沮丧的问题。
有几种方法可以解决此问题:
正如您所提到的,在每个自定义视图控制器中设置preferredContentSize
,将标签内容保持为所需大小。这是不灵活的,但确实有效。
// Swift
class FooViewController: ViewController {
override func viewWillAppear() {
super.viewWillAppear()
preferredContentSize = NSSize(width: 400, height: 280)
}
}
我在this SO回答中找到了一个更好的解决方案的提示。您可以将子视图(stackview,nsview等)添加到视图控制器的主视图中,该视图处理选项卡的内容(p!),然后添加将其固定到每个边缘的约束并添加设置大小的约束。
这是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
的位置之后,也会调用此方法。
在每个选项卡式视图控制器本身中设置首选的内容大小并不理想:同一代码在多个控制器之间重复,如果在其他位置重复使用这些控制器,则会增加不必要的噪音。