cocoaexpandnssplitview

How to expand and collapse parts of NSSplitView programmatically?


I want to replace RBSplitView with NSSplitView in my existing project. The application is now leopard only and I would like to replace RBSplitView with the new NSSplitView shipped with Leopard.

However, I'm missing RBSplitView's handy methods expand and collapse in NSSplitView. How can I expand and collapse parts of NSSplitView programmatically?


Solution

  • I just got programmatic expanding and collapsing of NSSplitView to work. I've also configured my NSSplitView to expand/collapse a subview whenever the divider is double-clicked, so I wanted this to play nice with that feature (and it seems to). This is what I did:

    (in this example, splitView is the NSSplitView itself, splitViewSubViewLeft is the subview I wish to expand/collapse and lastSplitViewSubViewLeftWidth is an instance variable of type 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
             ];
    }