我有一个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
做它需要做的任何内部魔术,然后擦除它绘制的所有内容并将其覆盖。