【问题标题】:How to toggle visibility of NSSplitView subView + hide Pane Splitter divider?如何切换 NSSplitView 子视图的可见性 + 隐藏窗格拆分器分隔线?
【发布时间】:2012-03-23 10:33:41
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: objective-c cocoa swift toggle nssplitview


    【解决方案1】:

    这是一个相当不错的教程,展示了如何做到这一点:Unraveling the Mysteries of NSSplitView

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

    如果您不喜欢 NSSplitView 的操作方式,则必须自己更改帧大小的动画。

    【讨论】:

    • shouldHideDividerAt 仅在分隔线位于拆分视图的边缘时有效,而不是在 2 个窗格之间时有效。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      我在@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 是您要折叠的子视图。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 谢谢!你知道这是否可以扩展到使用两个不同的侧边栏吗?
        【解决方案5】:

        我在上面的代码中得到了一些工件,可能是因为它脱离了上下文。我确信它可以在它应该做的地方工作。无论如何,这是一个非常精简的实现:

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

        【讨论】:

          【解决方案6】:

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

          splitViewController.toggleSidebar(nil)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-10-03
            • 1970-01-01
            • 2017-11-05
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多