我有一个NSOutlineView,其中自定义NSTableViewRows始终使用。

我已经重写了NSTableViewRow上的draw方法:

override func draw(_ dirtyRect: NSRect) {}


...所以它永远都不会画任何东西。但是,行有时为纯黑色,有时为透明。我无法制定出何时的模式。

如果我确实在绘画功能中放了一些东西,它将在发生时在黑色上绘画,除了填充纯色外,我似乎无法清除绘画功能中的黑色。

为了清除,我尝试过:

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




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


如果我在“调试视图层次结构”中查看,则可以清楚地看到,NSTableViewRow本身就是黑色的。

我已经尝试在draw函数中设置wantLayer并设置图层的backgroundColor,但这没有效果。

任何人都可以解释这种黑色填充物可能来自何处以及住在哪里!

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

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


...这表明NSTableViewRow有点奇怪。

最佳答案

(从注释中复制,因为我们已经找到了解决方法)

NSTableRowView的文档指出,“它负责显示与该行关联的属性,包括选择突出显示和组行外观”。因此,基本行视图类显然正在做某事,而表视图可能对此做了一些假设,我想像一下它是棘手的并且经过高度优化。 :(

一种解决方法是在您的super.draw(dirtyRect)中调用draw(_:NSRect)只是让基类NSTableRowView做它需要做的任何内部魔术,然后擦除它绘制的所有内容并将其覆盖。

09-25 18:00