无法覆盖 NSTableViewRow draw() 行为以使 NSOutlineView 透明

Can't override NSTableViewRow draw() behaviour to make transparent in NSOutlineView

我有一个 NSOutlineView,整个过程中都使用了自定义 NSTableViewRows。

我已经覆盖了 NSTableViewRow 的绘制方法:

override func draw(_ dirtyRect: NSRect) {}

...所以它不应该绘制任何东西。然而,行有时是纯黑色的,有时是清晰的。我想不出什么时候的模式。

如果我确实在绘制函数中放置了一些东西,当它发生时它会在黑色上绘制,我似乎无法清除绘制函数中的黑色,除了填充纯色。

清除我已经尝试过:

let context = NSGraphicsContext.current?.cgContext
context?.clear(dirtyRect)

NSColor.clear.setFill()
dirtyRect.fill(using: .copy)

如果我查看 Debug View Hierarchy,我可以清楚地看到 NSTableViewRow 本身是黑色的。

我试过在绘图函数中设置 wantsLayer 和图层的 backgroundColor,但没有效果。

任何人都可以解释这个黑色填充可能来自哪里以及它在哪里!

我设法确保它不存在的唯一方法是使用:

override var wantsUpdateLayer: Bool { get { return true } }

...这表明 NSTableViewRow 正在做一些奇怪的事情。

(从评论中复制,现在我们已经发现了解决方法)

NSTableRowView 的文档指出它 "is responsible for displaying attributes associated with the row, including the selection highlight, and group row look." 所以基本行视图 class 显然在做某事,而 table 视图可能对此做了假设,我想它很棘手且经过高度优化。 :(

一个变通方法是在你的 draw(_:NSRect) 中调用 super.draw(dirtyRect) 只是让基数 NSTableRowView class 做它需要做的任何内部魔法,然后擦除无论它画了什么,都画在上面。

我实际上想到了一个可能不那么棘手的解决方案:向 NSTableRowView 添加一个完全填充其 bounds 的不透明子视图,然后在该子视图中绘制您要绘制的任何内容。

子类 NSTableRowView 添加覆盖 isOpaque

Swift:

override var isOpaque: Bool {
    get {
        return false
    }
    set {
        
    }
}

Obj-C:

- (BOOL)isOpaque {
   return NO;
}

考虑到图纸比较多。喜欢:

override func drawBackground(in dirtyRect: NSRect) {
override func drawSelection(in dirtyRect: NSRect) {
override func drawSeparator(in dirtyRect: NSRect) {
and more...