Как переключить видимость NSSplitView subView + скрыть разделитель Pane Splitter? - PullRequest
7 голосов
/ 23 марта 2012

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

Что было бы оптимальным для какао-удобный способ переключения вида SideBar?

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

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

Ответы [ 4 ]

7 голосов
/ 23 марта 2012

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

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

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

4 голосов
/ 21 января 2015

Я написал 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 - это то, которое вы хотите свернуть.

3 голосов
/ 29 сентября 2017

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

3 голосов
/ 06 мая 2016

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

// 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, чтобы загрузить этот файл .

...