【发布时间】:2018-04-13 16:18:00
【问题描述】:
我有一个带有自定义 NSTableViewRows 的 NSOutlineView。
我已经覆盖了 NSTableViewRow 的 draw 方法:
override func draw(_ dirtyRect: NSRect) {}
...所以它不应该画任何东西。但是,行有时是纯黑色,有时是清晰的。我无法确定何时发生的模式。
如果我确实在绘图函数中放入了一些东西,它会在它发生时绘制黑色,我似乎无法在绘图函数中清除黑色,除了用纯色填充。
为了清除我已经尝试过:
let context = NSGraphicsContext.current?.cgContext
context?.clear(dirtyRect)
和
NSColor.clear.setFill()
dirtyRect.fill(using: .copy)
如果我查看调试视图层次结构,我可以清楚地看到黑色的是 NSTableViewRow 本身。
我试过在draw函数中设置wantsLayer和设置图层的backgroundColor,但是没有效果。
谁能解释这个黑色填充物可能来自哪里以及它生活在哪里!
我设法确保它不存在的唯一方法是使用:
override var wantsUpdateLayer: Bool { get { return true } }
...这表明 NSTableViewRow 正在做一些奇怪的事情。
【问题讨论】:
-
我没有建议,但我会注意到
NSTableRowView的文档指出它“负责显示与行关联的属性,包括选择突出显示和组行外观。”因此,基本行视图类显然在做某事,而表视图可能对此做出假设,我认为它可能很棘手且高度优化。 :( -
谢谢詹姆斯。是的,组和选择行为似乎在这里起作用(我为组和非组行重用相同的对象)。我觉得奇怪的是,记录在案的覆盖默认行为的方法不允许我创建我想要的外观 - 例如半透明行。
-
编辑标题以澄清问题和目标,因为投票范围太广。
-
想一想,说不定还是可以的。你有没有试过调用
super.draw(dirtyRect:)(这样框架就可以做它想做的任何事情),然后忽略它并通过使用clear绘制来擦除所有内容? -
嗨@JamesBucanek。非常感谢你的帮助。我已经回到这一点,你的最后一个建议确实有效。这似乎有点违反直觉,但强迫父母绘制,然后将其清除就可以了。请添加为答案,我会将其标记为正确。
标签: swift cocoa nsoutlineview nstablerowview