如何以编程方式展开和折叠部分NSSplitView?

coc*_*fan 17 cocoa expand nssplitview

我想,以取代RBSplitViewNSSplitView我现有的项目.该应用程序现在只有豹子,我想用Leopard附带RBSplitView新产品 替换NSSplitView.

不过,我错过RBSplitView的便利方法expandcollapseNSSplitView.如何以编程方式展开和折叠部分NSSplitView?

And*_*den 29

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

[aSubViewToCollapse setHidden:YES];
Run Code Online (Sandbox Code Playgroud)

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

  • +1这应该是实际按预期工作的答案.` - [NSSplitView isSubviewCollapsed:]`如果子视图被隐藏,则返回`YES`. (3认同)
  • 无论如何你需要调用` - [NSSplitView adjustSubviews]`来设置隐藏后立即更新图形. (3认同)

has*_*seg 9

我刚刚进行了程序化扩展和崩溃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
         ];
}
Run Code Online (Sandbox Code Playgroud)

  • 方法`setPosition:ofDividerAtIndex:`不会将子视图缩小为零大小.在上面的代码中,作者将新位置设置为固定值(`lastSplitViewSubViewLeftWidth`),但是可以使用`setPosition:NSMaxX(subview.frame)ofDividerAtIndex:0`恢复预折叠值.请注意,由于子视图保留其原始宽度,因此不需要通知来存储它.另请参阅:http://cocoadev.com/wiki/NSSplitView (3认同)
  • 这实际上并没有"崩溃"子视图.它只是将它缩小到0.这是一个问题,因为`-isSubviewCollapsed:`仍然总是返回`NO`,如果你的子视图的界面有任何自动调整蒙版应用,它们就会搞砸了.请参阅下面的解决方案,其中涉及使用`-setHidden:`来获得正确的答案. (2认同)

Mil*_*ays 6

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

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

if ([splitViewTop isHidden]) {
    [splitViewTop setHidden:NO];
    [split
     setPosition:previousSplitViewHeight
     ofDividerAtIndex:0];
}
else {
    [splitViewTop setHidden:YES];
}
[split adjustSubviews];
Run Code Online (Sandbox Code Playgroud)

  • 这里的混乱似乎围绕着"崩溃"的定义.折叠视图是否意味着将其大小设置为0或隐藏它.NSSplitViewDelegate Protocol在splitView中给出了这个定义:canCollapseSubview:"折叠的子视图被隐藏但被拆分视图对象保留,其大小与折叠前相同." 所以,@ jemmons和Milliways似乎就在它的右边. (3认同)

Dan*_*rdh 6

在 El Capitan,这对我有用。

splitViewItem.collapsed = YES;
Run Code Online (Sandbox Code Playgroud)