无法覆盖 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...
我有一个 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...