NSGridview的背景颜色

时间:2017-10-20 16:41:07

标签: swift cocoa appkit

我尝试通过对其进行子类化并覆盖其NSGridView方法来设置draw的背景颜色:

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方法。

3 个答案:

答案 0 :(得分:4)

NSGridView是一个轻量级组件,如NSStackView,仅用于布局。因此,它不会画画。

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

答案 1 :(得分:0)

更新:如果可能,最好采取catlan的答案。他是对的,因为NSGridView并不是真正意义上的渲染,而这种方法或多或少会强迫它走下去。

此时,几乎每个Cocoa应用程序都应该对它们的视图进行分层支持,而NSGridView和NSStackView也没有任何区别。只需在图层上设置背景颜色。

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

答案 2 :(得分:0)

NSGridView是NSView的子类,因此它继承了NSView的所有属性和方法包括绘图-如draw(_ dirtyRect: NSRect)函数所示。确保在视图控制器中包含IBOutlet,或将Interface Builder中的NSGridView类更改为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")
    }
}

基本上,您的视图控制器不知道您已将网格视图子类化。