NSGridview 的背景色

Background color of NSGridview

我尝试通过子类化并覆盖其 draw 方法来设置 NSGridView 的背景颜色,如下所示:

class GridViewGreen: NSGridView
{ override func draw(_ dirtyRect: NSRect)
  { super.draw(dirtyRect)

    let color = NSColor.green
    let bp = NSBezierPath(rect: dirtyRect)
    color.set()
    bp.stroke()

    print("drawing GridViewGreen")
  }
}

但从未调用 draw 方法。

NSGridView是一个轻量级组件,像NSStackView一样,仅用于布局。因此它不绘制。

只需将 NSGridView 放入 NSBox 并设置其 fillColor

更新:如果可能的话最好采纳catlan的回答。他是对的,NSGridView 并不是真正用于渲染,这种方法或多或少会迫使它走这条路。

在这一点上,几乎每个 Cocoa 应用程序都应该对其视图进行分层支持,NSGridView 和 NSStackView 没有任何不同。只需在图层上设置背景颜色即可。

let gridView = NSGridView(views: [[view1, view2]])
gridView.wantsLayer = true
gridView.layer?.backgroundColor = NSColor.red.cgColor

NSGridView 是 NSView 的子class,因此它继承了 NSView 的所有属性和方法包括 绘图 - 如 draw(_ dirtyRect: NSRect) 函数所示。确保在视图控制器中包含一个 IBOutlet 或将 Interface Builder 中的 NSGridView class 更改为 GridViewGreen。

class GridViewGreen: NSGridView {
    override init(frame frameRect: NSRect) {
        super.init(frame: frameRect)
    }
    required init?(coder: NSCoder) {
        super.init(coder: coder)
    }
    override func draw(_ dirtyRect: NSRect) {
        super.draw(dirtyRect)
        NSColor.green.setFill()
        dirtyRect.fill()
        print("drawing GridViewGreen")
    }
}

基本上您的视图控制器并不知道您class编辑了您的网格视图。