【问题标题】:Can't override NSTableViewRow draw() behaviour to make transparent in NSOutlineView无法覆盖 NSTableViewRow draw() 行为以在 NSOutlineView 中透明
【发布时间】: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


【解决方案1】:

(由于我们发现了一种解决方法,因此从 cmets 复制)

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 谢谢詹姆斯。我实际上是想在浮动标题行中绘制一个 alpha 渐变。
    【解决方案3】:

    子类 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...
    

    【讨论】:

      猜你喜欢
      • 2016-12-10
      • 2016-07-14
      • 2017-01-18
      • 1970-01-01
      • 1970-01-01
      • 2012-09-06
      • 1970-01-01
      • 1970-01-01
      • 2013-01-29
      相关资源
      最近更新 更多