我尝试通过对其进行子类化并覆盖其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
方法。
答案 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")
}
}
基本上,您的视图控制器不知道您已将网格视图子类化。