如何切换NSSplitView子视图+隐藏Pane Splitter分隔符的可见性?

时间:2012-03-23 10:33:42

标签: objective-c cocoa swift toggle nssplitview

我们有一个父Split视图(NSSplitView)和两个子视图,ContentSideBar(侧边栏位于右侧)。

切换SideBar视图的最佳Cocoa友好方式是什么?

  • 如果推荐的解决方案包含动画
  • ,我真的很喜欢它
  • 我真的不需要任何与外部插件等相关的建议(例如BWToolkit)

提示:我一直在尝试这样做,但我仍然有问题隐藏NSSplitView的分隔符。我怎么能这样做,同时隐藏它?

6 个答案:

答案 0 :(得分:7)

这是一个相当不错的教程,展示了如何执行此操作:Unraveling the Mysteries of NSSplitView

隐藏分隔符是在NSSplitView的委托方法splitView:shouldHideDividerAtIndex:中完成的。

如果你不喜欢NSSplitView的方式,你必须自己设置帧大小的动画。

答案 1 :(得分:4)

我在@ Nathan的回答链接中写了一个Swift版本的内容,对我有用。在我的示例的上下文中,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是您想要折叠的子视图。

答案 2 :(得分:3)

我使用上面的代码获得了一些工件,可能是因为它不在上下文中。我确信它的工作原理。无论如何,这是一个非常精简的实现:

// 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键并单击以下载this file

答案 3 :(得分:3)

在Xcode 9.0中,使用Storyboard打开应用程序场景,选择View-> Menu-> Show sidebar。按住CTRL键单击“显示侧栏”,在发送的操作中删除提供的操作,单击“x”。从圆圈CTRL拖动到应用程序场景中的First Responder并选择toggleSideBar进行连接。打开故事板并选择第一个拆分视图项,并在属性检查器中将行为从默认更改为侧边栏。运行并尝试使用视图菜单项显示/隐藏。所有在界面构建器中完成没有代码。 toggleSideBar处理第一个拆分视图项。 https://github.com/Dis3buted/SplitViewController

答案 4 :(得分:0)

最简单的方法如下-动画:[ SWIFT 5 ]

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

答案 5 :(得分:0)

如果您的 NSSplitView 控件是 NSSplitViewController 对象的一部分,那么您可以简单地使用:

splitViewController.toggleSidebar(nil)