如何使用Big-Sur样式的工具栏+旧代码库中的拆分视图?

问题描述

根据this WWDC 2020 talk, 大苏尔(Big Sur)的工具栏会自动划分为与下面NssplitView的窗格匹配并遵循的窗格。

不幸的是,这要求我们使用在{10.10 Yosemite中引入的NSViewController API的后NssplitView版(请参见此处的相应WWDC 2014 session PDF。)

在带有旧NSViewController NssplitView的真正旧代码库中使用它的最简单方法是什么?

众所周知,新型NssplitView在XIB中不可用,而仅在情节提要中可用,如this StackOverflow post中所述。

解决方法

我发现您可以在NSSplitView内将awakeFromNib从旧样式交换为新样式。示例代码如下。

我假设windowoldSplitViewIBOutlet到XIB中的相应对象,并且创建了两个虚拟NSViewController s leftVCrightVC XIB中view连接到左窗格和右窗格的XIB中。然后,您要做的就是:

    // 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;

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...