Как включить видимость NSSplitView панель + панель сплиттер делитель?


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

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

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

Подсказка: я пытался сделать это, но все равно у меня были проблемы со скрытием разделителя И NSSplitView тоже. Как я мог это сделать, в то же время скрывая это?

4 6

4 ответа:

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

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

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

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

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

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

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

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