swift 如何切换NSSplitView子视图的可见性+隐藏窗格拆分器分隔符?

5kgi1eie  于 2023-05-21  发布在  Swift
关注(0)|答案(6)|浏览(292)

我们有一个父视图SplitNSSplitView)和两个子视图ContentSideBar(侧边栏在右侧)。
切换SideBar视图的最佳Cocoa友好方式是什么?

  • 我真的很喜欢它,如果建议的解决方案包括动画
  • 我真的不需要任何有关外部插件的建议,等等(例如:BWToolkit)
    **提示:**我一直在尝试这样做,但我仍然有问题隐藏NSSplitView的分隔符。我怎么能这样做,同时隐藏它?
wlwcrazw

wlwcrazw1#

这里有一个相当不错的教程,展示了如何做到这一点:Unraveling the Mysteries of NSSplitView
隐藏分隔符是在NSSplitView的委托方法splitView:shouldHideDividerAtIndex:中完成的。
如果你不喜欢NSSplitView的方式,你将不得不自己设置帧大小变化的动画。

iqih9akk

iqih9akk2#

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

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

km0tfn4u3#

我写了一个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是您想要折叠的子视图。

ie3xauqp

ie3xauqp4#

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

eit6fx6z

eit6fx6z5#

我用上面的代码得到了一些工件,可能是因为它脱离了上下文。我相信它在它应该在的地方工作。总之,这里有一个非常精简的实现:

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

sirbozc5

sirbozc56#

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

splitViewController.toggleSidebar(nil)

相关问题