Как переключить видимость NSSplitView subView + скрыть разделитель Pane Splitter?

У нас есть родитель Split Посмотреть (NSSplitView) и два подпредставления, Content а также SideBar (боковая панель справа).

Каков оптимальный способ использования какао? SideBar Посмотреть?

  • Мне бы очень понравилось, если бы предлагаемое решение включало анимацию
  • Мне действительно не нужны какие-либо предложения, связанные с внешними плагинами и т. Д. (Например, BWToolkit)

СОВЕТ: Я пытался это сделать, но все же у меня были проблемы, скрывающие разделитель NSSplitView. Как я мог это сделать, одновременно скрывая это?

6 ответов

Решение

Вот довольно приличный учебник, который показывает, как это сделать: Раскрыть тайны NSSplitView.

Скрытие разделителя выполняется в методе делегата NSSplitView splitView: shouldHideDividerAtIndex:.

Вам придется анимировать изменение размера кадра самостоятельно, если вам не нравится, как это делает NSSplitView.

Самый простой способ сделать это - и он анимирован: [SWIFT 5]

    splitViewItems[1].animator().isCollapsed = true // Show side pane
    splitViewItems[1].animator().isCollapsed = false // hide side pane

В Xcode 9.0 с раскадровками откройте Application Scene и выберите View->Menu->Show sidebar. Нажмите CTRL, нажмите Показать боковую панель, в отправленных действиях удалите предоставленную, нажмите на x. Перетащите курсор из круга CTRL на First Responder на сцене приложения и выберите toggleSideBar для подключения. Откройте раскадровку и выберите первый разделенный элемент представления, а в инспекторе атрибутов измените поведение по умолчанию на боковую панель. Запустите и попробуйте с представлением пункта меню показать / скрыть. Все сделано в интерфейсе конструктора без кода. toggleSideBar обрабатывает первый разделенный элемент представления. https://github.com/Dis3buted/SplitViewController

Я написал Swift-версию контента по ссылке из ответа @Nathan, которая работает для меня. В контексте моего примера splitView устанавливается в другом месте, вероятно, как свойство экземпляра в охватывающем классе:

func toggleSidebar () {
    if splitView.isSubviewCollapsed(splitView.subviews[1] as NSView) {
        openSidebar()
    } else {
        closeSidebar()
    }
}

func closeSidebar () {
    let mainView = splitView.subviews[0] as NSView
    let sidepanel = splitView.subviews[1] as NSView
    sidepanel.hidden = true
    let viewFrame = splitView.frame
    mainView.frame.size = NSMakeSize(viewFrame.size.width, viewFrame.size.height)
    splitView.display()
}

func openSidebar () {
    let sidepanel = splitView.subviews[1] as NSView
    sidepanel.hidden = false
    let viewFrame = splitView.frame
    sidepanel.frame.size = NSMakeSize(viewFrame.size.width, 200)
    splitView.display()
}

Эти функции, вероятно, будут методами в классе, они для меня. Если твой splitView может быть nil Вы, очевидно, должны проверить это. Это также предполагает, что у вас есть два подпредставления и одно с индексом 1, здесь как sidePanel это тот, который вы хотите свернуть.

Я получил некоторые артефакты с кодом выше, вероятно, потому что это было вне контекста. Я уверен, что это работает там, где это было задумано. В любом случае, здесь очень упрощенная реализация:

// this is the declaration of a left vertical subview of
// 'splitViewController', which is the name of the split view's outlet

var leftView: NSView {
    return self.splitViewController.subviews[0] as NSView
    }

// here is the action of a button that toggles the left vertical subview
// the left subview is always restored to 100 pixels here

@IBAction func someButton(sender: AnyObject) {

    if splitViewController.isSubviewCollapsed(leftView) {
        splitViewController.setPosition(100, ofDividerAtIndex: 0)
        leftView.hidden = false
    } else {
        splitViewController.setPosition(0, ofDividerAtIndex: 0)
        leftView.hidden = true
    }
}

Чтобы увидеть хороший пример использования анимации, щелкните этот файл, удерживая клавишу Control.

Если твой NSSplitViewконтроль является частью NSSplitViewControllerобъект, то вы можете просто использовать это:

      splitViewController.toggleSidebar(nil)
Другие вопросы по тегам