在 NSSplitView 中隐藏分隔线

Hiding Dividers in NSSplitView

因为 NSSplitView 不允许隐藏它的分隔线(委托方法只允许隐藏分割视图边缘的分隔线),我选择继承 NSSplitView 并覆盖它的绘图防止绘制特定分隔线的方法。

但是,一旦我重写 draw(rect:)drawDivider(in:),如果我像这样折叠一个项目,NSSplitView 就不再为其分隔线设置动画

activityItem.animator().isCollapsed = collapsed

如果我不添加自己的绘图代码直接调用super甚至会发生

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

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

基本上我想要实现的是在分隔线旁边隐藏一个拆分视图项目,但这显然对 NSSplitView 没有完全重新实现它的要求太过分了。

我已经迫不及待了。还有其他方法来完成隐藏项目 + 分隔线吗?

好的,我走了一条完全不同的路,找到了让它工作的方法。因此,如果您正在尝试完全自定义分隔线,这就是您的做法。

  1. 子类 NSSplitView 和 return 0 来自 dividerThickness

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

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

  2. 覆盖拆分视图委托方法 splitView(:additionalEffectiveRectOfDividerAt:) 并手动 return 符合您的自定义 NSBox 分隔符的矩形

您可能需要在 NSView 坐标之间 convert(:from:) 以获得有效的矩形,但它有效!代表可能看起来像这样

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
}

给你。也适用于动画的自定义分隔线!