Как переключить видимость 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)