19

我想在我现有的项目中替换RBSplitView为。NSSplitView该应用程序现在只有 leopard,我想用 Leopard 随附RBSplitView新应用程序替换。 NSSplitView

但是,我缺少RBSplitView' 方便的方法expandcollapse. NSSplitView如何以编程方式展开和折叠部分 NSSplitView?

4

10 回答 10

31

只需隐藏要折叠的子视图,例如

[aSubViewToCollapse setHidden:YES];

您可能还想实现委托方法 -(BOOL)splitView:shouldHideDividerAtIndex: 返回 YES 以在折叠时隐藏分隔线。

于 2010-04-28T09:29:37.243 回答
10

我刚刚得到了程序扩展和折叠的NSSplitView工作。我还配置NSSplitView了每当双击分隔线时展开/折叠子视图,所以我希望这个功能可以很好地使用该功能(而且看起来如此)。这就是我所做的:

(在这个例子中,splitView是它NSSplitView本身,splitViewSubViewLeft是我希望展开/折叠的子视图,并且lastSplitViewSubViewLeftWidth是一个类型的实例变量CGFloat。)

// subscribe to splitView's notification of subviews resizing
// (I do this in -(void)awakeFromNib)
[[NSNotificationCenter defaultCenter]
 addObserver:self
 selector:@selector(mainSplitViewWillResizeSubviewsHandler:)
 name:NSSplitViewWillResizeSubviewsNotification
 object:splitView
 ];

// this is the handler the above snippet refers to
- (void) mainSplitViewWillResizeSubviewsHandler:(id)object
{
    lastSplitViewSubViewLeftWidth = [splitViewSubViewLeft frame].size.width;
}

// wire this to the UI control you wish to use to toggle the
// expanded/collapsed state of splitViewSubViewLeft
- (IBAction) toggleLeftSubView:(id)sender
{
    [splitView adjustSubviews];
    if ([splitView isSubviewCollapsed:splitViewSubViewLeft])
        [splitView
         setPosition:lastSplitViewSubViewLeftWidth
         ofDividerAtIndex:0
         ];
    else
        [splitView
         setPosition:[splitView minPossiblePositionOfDividerAtIndex:0]
         ofDividerAtIndex:0
         ];
}
于 2009-07-09T11:13:00.190 回答
7

我尝试了上面的解决方案,发现它不起作用,因为 isSubviewCollapsed 从来没有返回 YES

建议的组合产生了有效的结果

if ([splitViewTop isHidden]) {
    [splitViewTop setHidden:NO];
    [split
     setPosition:previousSplitViewHeight
     ofDividerAtIndex:0];
}
else {
    [splitViewTop setHidden:YES];
}
[split adjustSubviews];
于 2011-07-11T05:18:20.420 回答
6

在 El Capitan,这对我有用。

splitViewItem.collapsed = YES;
于 2015-12-11T16:25:20.873 回答
3

在尝试了一些建议后,这是我发现的最简单的解决方案:

-(void)toggleCollapsibleView:(ib)sender {
   [collapsibleView setHidden:![splitView isSubviewCollapsed:collapsibleView]];
   [splitView adjustSubviews];
}

该功能是用户定义的第一响应者动作。它由菜单项(或击键)触发。collapsibleView 是 splitView 中的一个子视图,两者都在 IB 中通过它们的属性连接。

于 2014-01-04T11:43:25.600 回答
3

在 macOS Sierra 中,该collapsed属性更改为isCollapsed. 直接将属性设置为trueor false。以下代码来自我WindowController的,我有两个SplitViewItems。

@IBAction func toggleMap(_ sender: Any) {
    if let splitViewController = contentViewController as? NSSplitViewController {
        let splitViewItem = splitViewController.splitViewItems
        if splitViewItem.first!.isCollapsed {
            splitViewItem.first!.isCollapsed = false
        } else if splitViewItem.last!.isCollapsed {
            splitViewItem.last!.isCollapsed = false
        } else {
            if splitViewItem.first!.isCollapsed {
                splitViewItem.first!.isCollapsed = false
            }
            splitViewItem.last!.isCollapsed = true
        }
    }
}
于 2017-02-06T19:28:56.693 回答
2

NSSplitView实际上有一个私有方法 -(void)_setSubview:(NSView *)view isCollapsed:(BOOL)collapsed可以做到这一点。那些想忽略所有反对使用私有方法的警告的人,看:

- (void)toggleSubview:(NSView *)view {
    SEL selector = @selector(_setSubview:isCollapsed:);
    NSMethodSignature *signature = [NSSplitView instanceMethodSignatureForSelector:selector];
    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
    invocation.target = self;
    invocation.selector = selector;
    [invocation setArgument:&view atIndex:2];
    BOOL arg = ![self isSubviewCollapsed:view];
    [invocation setArgument:&arg atIndex:3];
    [invocation invoke];
}

我将其实现为NSSplitView. 唯一的问题是 Xcode 会发出关于_setSubview:isCollapsed:未声明的警告......我不确定如何解决这个问题。


埃尔卡皮坦更新

我已经有大约 2 年没有为 OS X 编写任何代码了,所以我无法验证这一点,但根据下面评论中的lemonmojo_setSubview:isCollapsed: ,在 El Capitan 中将其重命名为_setArrangedView:isCollapsed:.

于 2013-11-17T06:10:25.477 回答
2

迅速这工作

func togglePanel() {
    let splitViewItem = self.mySplitView.arrangedSubviews

    if mySplitView.isSubviewCollapsed(outline.view){
        splitViewItem[0].hidden = false
    } else {
        splitViewItem[0].hidden = true
    }

从 IBAction 调用它,outline 是一个带有自己的 xib 的 OutlineViewController,我们需要视图因此是 outline.view,保持简单但希望你明白

@IBAction func segmentAction(sender: NSSegmentedControl) {
    splitVC?.togglePanel(sender.selectedSegment)
}

func togglePanel(segmentID: Int) {
    let splitViewItem = self.mySplitView.arrangedSubviews

    switch segmentID {

    case segmentID:
        if mySplitView.isSubviewCollapsed(splitViewItem[segmentID]) {
            splitViewItem[segmentID].hidden = false
        } else {
            splitViewItem[segmentID].hidden = true
        }
    default:
        break
    }

}

并实现委托

func splitView(splitView: NSSplitView, shouldHideDividerAtIndex dividerIndex: Int) -> Bool {
    return true
}

在 10.11 中,您可能只使用 toggleSidebar 操作方法。 如何切换 NSSplitView 子视图的可见性 + 隐藏窗格拆分器分隔线? https://github.com/Dis3buted/SplitViewController

于 2016-05-11T11:00:03.117 回答
1

我建议NSSplitViewController改用并NSSplitViewItem.isCollapsed控制它们。这只是工作。

let item: NSSplitViewItem = ...
item.isCollapsed = true

为了使其正常工作,您必须配置主要使用视图控制器的拆分 UI 组件。否则,它可能会被破坏。

于 2018-09-23T14:26:35.287 回答
0

你可以试试 Brandon Walkin 的BWToolKit

BWSplitView 类有一个方法

- (IBAction)toggleCollapse:(id)sender;
于 2009-05-29T10:17:30.980 回答