如何隐藏nssplitview的分隔符?

时间:2009-12-24 09:06:42

标签: cocoa split nssplitview

现在我想在我的应用运行时隐藏或显示我的条件分隔符。使用了这个委托方法:

- (BOOL)splitView:(NSSplitView *)splitView shouldHideDividerAtIndex:(NSInteger)dividerIndex
{
   if (A) 
       return YES;
   else 
       return NO;
}

但它不起作用,为什么?如何使用这种方法?非常感谢你!

5 个答案:

答案 0 :(得分:9)

继上面的@ carmin注释,覆盖NSSplitView dividerThickness属性是唯一对我有用的东西(具体来说,从splitView返回NSRectZero:effectiveRect:forDrawnRect:ofDividerAtIndex:NSSplitView委托方法 - {{3 - 没有用,导致浮动分隔符与视图本身脱节。)

这是Swift中的代码:

override var dividerThickness:CGFloat
{
    get { return 0.0 }
}

答案 1 :(得分:4)

拆分视图将该消息发送给其委托,询问委托是否应该隐藏该分隔符。所以,be the delegate,并回答拆分视图的问题。

请务必查看the documentation。该消息可能无法实现您的目标。该文档列出了您通过回复该消息可以做的所有事情。

答案 2 :(得分:3)

您可以重载NSSplitView-dividerThickness并返回0以隐藏所有分隔符。您可以重载NSSplitView-drawDividerInRect:以单独控制分隔符(选择允许super绘制分隔符)。即使子视图可见,这些选择仍然有效。

答案 3 :(得分:2)

以下是如何在不涉及子类化的Obj-C中执行此操作。确保您已连接IB中的SplitView委托。

然后在你的委托类中:

 -(NSRect)splitView:(NSSplitView *)splitView effectiveRect:(NSRect)proposedEffectiveRect forDrawnRect:(NSRect)drawnRect ofDividerAtIndex:(NSInteger)dividerIndex 
{

    if ( [_splitView subviews][1].isHidden ==YES || [[_splitView subviews][1] frame].size.height < 50) //closed or almost closed
    {

    return NSZeroRect;

    }

    return proposedEffectiveRect;

}



- (BOOL)splitView:(NSSplitView *)splitView shouldHideDividerAtIndex:(NSInteger)dividerIndex 
{

    if ( [_splitView subviews][1].isHidden ==YES || [[_splitView subviews][1] frame].size.height < 50)
   {

    return YES;
   }

    return NO;
}

这将在分割视图关闭时隐藏分隔符,但在打开时显示它。

如果您不希望它们即使在打开时也能拖动它,只需删除第一个方法中的所有代码并仅返回NSZeroRect。在第二种方法中执行相同操作,只返回YES。

答案 4 :(得分:0)

为了后代,使用swift 2你可以调用委托函数splitView(_:effectiveRect:forDrawnRect:ofDividerAtIndex :)并让它返回一个空的NSRect

func splitView(splitView: NSSplitView, effectiveRect proposedEffectiveRect: NSRect, forDrawnRect drawnRect: NSRect, ofDividerAtIndex dividerIndex: Int) -> NSRect {
    return NSRect.init()
}