如何切换NSSplitView subView +隐藏窗格拆分器分隔线的可见性?

How to toggle visibility of NSSplitView subView + hide Pane Splitter divider?

提问人:Dr.Kameleon 提问时间:3/23/2012 最后编辑:BjornDr.Kameleon 更新时间:5/20/2023 访问量:9147

问:

我们有一个父视图 () 和两个子视图,以及 (侧边栏在右侧)。SplitNSSplitViewContentSideBar

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

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

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

Objective-C Cocoa Swift 切换 nssplitview

评论


答:

8赞 Nathan Kinsinger 3/24/2012 #1

这里有一个相当不错的教程,展示了如何做到这一点:揭开NSSplitView的奥秘

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

如果您不喜欢 NSSplitView 的方式,则必须自己对帧大小更改进行动画处理。

评论

1赞 2/11/2020
shouldHideDividerAt仅当分隔线位于拆分视图的边缘时才有效,而当它位于 2 个窗格之间时则无效。
4赞 Bjorn 1/22/2015 #2

我在 @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()
}

这些函数可能会是一个类中的方法,它们适合我。如果可以的话,你显然必须检查一下。这也假设您有两个子视图,一个位于索引 1 处,这里是您要折叠的子视图。splitViewnilsidePanel

3赞 Luis Vieira Damiani 5/6/2016 #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 键单击以下载此文件

4赞 Peter Ahlberg 9/29/2017 #4

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

评论

1赞 Josh 5/7/2018
谢谢!您知道是否可以将其扩展到两个不同的侧边栏吗?
6赞 rs7 7/19/2019 #5

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

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

评论

0赞 Willeke 12/23/2022
此答案使用 .NSSplitViewController
1赞 Ely 1/15/2021 #6

如果您的控件是对象的一部分,那么您可以简单地使用以下命令:NSSplitViewNSSplitViewController

splitViewController.toggleSidebar(nil)