在NSSplitView中隐藏分隔线

时间:2020-02-11 09:15:53

标签: swift macos cocoa

由于NSSplitView不允许隐藏其分隔符(委托方法仅允许隐藏位于拆分视图边缘的分隔符),因此我选择继承NSSplitView并将其draw方法重写为防止绘制特定的分隔线。

但是,一旦我覆盖draw(rect:)drawDivider(in:)NSSplitView就不会像我这样折叠一件物品时动画化它的分隔线

activityItem.animator().isCollapsed = collapsed

即使我直接调用super而没有添加自己的绘图代码,甚至会发生这种情况

override func draw(_ dirtyRect: NSRect) {
    super.draw(dirtyRect)
}

上面的代码足以完全破坏动画。

基本上,我想要实现的是将拆分视图项隐藏在其分隔符旁边,但这显然要求太多NSSplitView而又没有完全重新实现它。

我在这里的最后一根稻草上。还有其他方法可以隐藏项目+分隔符吗?

1 个答案:

答案 0 :(得分:1)

好吧,我采用了一种完全不同的方式,并找到了一种使其工作的方式。因此,如果您要完全自定义分隔线,这就是您的方法。

  1. 子类NSSplitView并从0返回dividerThickness

因此您的新拆分视图现在根本不会显示分隔线,但是您可以在所需的位置手动添加分隔线

  1. 添加NSBox或自定义分隔线视图,以使分隔线显示在拆分视图子视图中,最好在子视图的顶部。

  2. 重写拆分视图委托方法splitView(:additionalEffectiveRectOfDividerAt:),并手动返回与您的自定义NSBox分隔符匹配的rects

您可能需要在convert(:from:)坐标之间NSView才能获得有效的校正,但这是可行的!委托人可能看起来像这样

override func splitView(_ splitView: NSSplitView, additionalEffectiveRectOfDividerAt dividerIndex: Int) -> NSRect {
    let item = splitViewItems[dividerIndex]
    let itemView = item.viewController.view
    let frame = view.convert(itemView.bounds, from: itemView)

    let dividerFrame = CGRect(x: 0,
                              y: view.bounds.height - frame.minY,
                              width: frame.width,
                              height: 1)

    return dividerFrame
}

那里有。自定义分隔线也可用于动画!