首页 > 解决方案 > 如何使用旧代码库中的 Big-Sur 样式工具栏 + 拆分视图?

问题描述

根据这个 WWDC 2020 演讲,Big Sur 的工具栏会自动分区以匹配并遵循NSSplitView下面的窗格。

不幸的是,这需要我们使用10.10 Yosemite 中引入NSViewController的 api 的后期版本NSSplitView(请参阅此处相应的WWDC 2014 会议 PDF。)

从一个非常古老的代码库中使用它的最简单方法是什么NSViewController NSSplitView

众所周知,新样式NSSplitView在 XIB 中不可用,仅在故事板中可用,如StackOverflow 帖子中所述。

标签: macosnssplitviewnssplitviewcontroller

解决方案


我发现你可以在NSSplitView里面把旧式的换成新式的awakeFromNib。示例代码如下。

我假设windowand oldSplitViewareIBOutlet对应于 XIB 中的对象,以及两个虚拟NSViewControllersleftVCrightVC在 XIB 中创建,它们的views 连接到左窗格和右窗格。那么你所要做的就是:

    // enable scrolling behind the tool bar, if you haven't
    window.styleMask|=NSWindowStyleMaskFullSizeContentView;

    // create a new-style NSSplitView using NSSplitViewController
    splitVC=[[NSSplitViewController alloc] init];
    splitVC.splitView.vertical=YES;
    splitVC.view.translatesAutoresizingMaskIntoConstraints=NO;

    // prepare the left pane as a sidebar
    NSSplitViewItem*a=[NSSplitViewItem sidebarWithViewController:leftVC];
    [splitVC addSplitViewItem:a];
    a.canCollapse=NO;

    // prepare the right pane
    NSSplitViewItem*b=[NSSplitViewItem splitViewItemWithViewController:rightVC];
    [splitVC addSplitViewItem:b];

    // swap the old NSSplitView with the new one
    [window.contentView replaceSubview:oldSplitView with:splitVC.view ];

    // set up the constraints so that the new `NSSplitView` to fill the window
    [splitVC.view.topAnchor constraintEqualToAnchor:window.contentView.topAnchor
                                           constant:0].active=YES;
    [splitVC.view.bottomAnchor constraintEqualToAnchor:((NSLayoutGuide*)window.contentLayoutGuide).bottomAnchor].active=YES;
    [splitVC.view.leftAnchor constraintEqualToAnchor:((NSLayoutGuide*)window.contentLayoutGuide).leftAnchor].active=YES;
    [splitVC.view.rightAnchor constraintEqualToAnchor:((NSLayoutGuide*)window.contentLayoutGuide).rightAnchor].active=YES;

推荐阅读