Cocoa 如何隐藏nssplitview的分隔符?

Cocoa 如何隐藏nssplitview的分隔符?,cocoa,split,nssplitview,Cocoa,Split,Nssplitview,现在,当我的应用程序运行时,我想用我的条件隐藏或显示一个分隔符。使用此委托方法: - (BOOL)splitView:(NSSplitView *)splitView shouldHideDividerAtIndex:(NSInteger)dividerIndex { if (A) return YES; else return NO; } 但它不起作用,为什么?如何使用这种方法?多谢各位 拆分视图将该消息发送给其委托,询问委托是否应隐藏该分隔符。因

现在,当我的应用程序运行时,我想用我的条件隐藏或显示一个分隔符。使用此委托方法:

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

但它不起作用,为什么?如何使用这种方法?多谢各位

拆分视图将该消息发送给其委托,询问委托是否应隐藏该分隔符。因此,请回答分裂视图的问题


一定要退房。这条消息可能无法实现您希望它实现的目标。文档列出了通过响应该消息可以执行的所有操作。

您可以重载NSSplitView divider dickness并返回0以隐藏所有的divider。您可以重载NSSplitView DRAWDIVIDERIRECT:以对分割线进行单独控制(选择是否允许super绘制分割线)。这些选择即使在子视图可见时也有效。

更进一步,在上面@carmin的注释中,覆盖NSSplitView
divider dickness
属性是唯一对我有效的方法(具体来说,从splitView:effectiveRect:forDrawnRect:ofDividerAtIndex:NSSplitView委托方法返回NSRectZero–不起作用,导致浮动分隔符与视图本身脱节)

以下是Swift中的代码:

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

为了子孙后代的利益,使用Swift时,您可以调用委托函数
splitView(\uU9:effectiveRect:forDrawnRect:ofDividerAtIndex:)
,只需让它返回一个空NSRect即可

override func splitView(_ splitView: NSSplitView, effectiveRect proposedEffectiveRect: NSRect, forDrawnRect drawnRect: NSRect, ofDividerAt dividerIndex: Int) -> NSRect {

    if dividerIndex == 1 {
        return NSRect()
    }
    return super.splitView(splitView, effectiveRect: proposedEffectiveRect, forDrawnRect: drawnRect, ofDividerAt: dividerIndex)
}

下面介绍如何在不涉及子类化的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;
}
-(NSRect)拆分视图:(NSSplitView*)拆分视图效果器:(NSRect)建议的绘图效果器:(NSRect)绘图效果器索引:(NSInteger)dividerIndex
{
如果([[u splitView子视图][1].isHidden==YES |[u splitView子视图][1]frame].size.height<50)//关闭或几乎关闭
{
返回NSZeroRect;
}
返回建议生效日期;
}
-(BOOL)splitView:(NSSplitView*)splitView应包含分隔索引:(NSInteger)分隔索引
{
如果([[u splitView子视图][1].isHidden==YES[u splitView子视图][1]帧].size.height<50)
{
返回YES;
}
返回否;
}
这将在拆分视图关闭时隐藏分隔符,但在打开时显示分隔符


如果你不想让他们在它打开时也能拖动它,只需删掉第一个方法中的所有代码,只返回nszerorrect。在第二个方法中也这样做,只返回YES。

你需要将拆分视图的委托设置为类的一个实例,该实例需要响应相应的消息(参见我链接的文档)具有正确的值。看起来委托和分割厚度都是必需的。委托似乎启用/禁用了与分割器的交互。如果跳过实现委托,则使用仍然可以与不可见的分割器交互。分割视图:shoulldhidedividoratindex:不隐藏未折叠视图的分割器它也不隐藏分割视图中不在分割视图边缘的分隔符。因此,这个委托方法基本上是无用的。看看我的答案,看看这里如何正确地在分割视图中间隐藏分隔符。在Objul-C?谢谢。Objul-C:-(CGLAFT)分隔符{{返回0.0F } }中,如何使用分隔符?