Как использовать панель инструментов в стиле Big-Sur + разделенное представление из старой кодовой базы?

Согласно этому докладу на WWDC 2020, панель инструментов Big Sur автоматически разбита на разделы, соответствующие панелям NSSplitView ниже.

К сожалению, это требует от нас использования постNSViewController версии NSSplitView API, представленной в 10.10 Yosemite (см. соответствующий PDF-файл сессии WWDC 2014 здесь.)

Какой самый простой способ использовать его из действительно старой кодовой базы с pre-NSViewController NSSplitView в XIB?

Как известно, новый стиль NSSplitView недоступен в XIB и доступен только в раскадровке, как описано в этом StackOverflow. сообщение.


person Yuji    schedule 26.10.2020    source источник


Ответы (1)


Я обнаружил, что вы можете поменять местами NSSplitView со старого стиля на новый внутри awakeFromNib. Далее следует пример кода.

Я предположил, что window и oldSplitView являются IBOutlet соответствующими объектами в XIB, а два фиктивных NSViewController leftVC и rightVC созданы в XIB, чьи view связаны с левой и правой панелями. Тогда все, что вам нужно сделать, это:

    // 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;
person Yuji    schedule 26.10.2020