0

我有一个带有自定义 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 本身是黑色的。

我已经尝试设置 wantLayer 并在绘图函数中设置图层的背景颜色,但这没有效果。

谁能解释这个黑色填充物可能来自哪里以及它生活在哪里!

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

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

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

4

3 回答 3

0

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

NSTableRowView 的文档声明它“负责显示与行相关的属性,包括选择突出显示和组行外观。” 因此,基本行视图类显然在做某事,而表视图可能对此做出了假设,我认为它很棘手且高度优化。:(

一种解决方法是调用super.draw(dirtyRect)draw(_:NSRect),让基NSTableRowView类执行它需要执行的任何内部魔法,然后擦除它绘制的任何内容并覆盖它。

于 2018-05-15T17:03:44.820 回答
0

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

于 2018-05-15T17:05:10.397 回答
0

子类NSTableRowView添加覆盖isOpaque

迅速:

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

对象-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...
于 2021-09-23T08:17:33.977 回答