Intenté establecer el color de fondo de un NSGridView subclasificándolo y anulando su método draw de esta manera:

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")
  }
}

Pero el método draw nunca se llama.

1
mik 20 oct. 2017 a las 19:41

3 respuestas

La mejor respuesta

Actualización: Preferiblemente tome la respuesta de catlan si es posible. Tiene razón en que NSGridView realmente no está destinado a renderizar y este enfoque lo forzará más o menos por ese camino.

En este punto, casi todas las aplicaciones de Cocoa deberían respaldar sus vistas en capas y NSGridView y NSStackView no son diferentes. Simplemente configure el color de fondo en la capa.

let gridView = NSGridView(views: [[view1, view2]])
gridView.wantsLayer = true
gridView.layer?.backgroundColor = NSColor.red.cgColor
0
Lucas Derraugh 11 jun. 2018 a las 20:51

NSGridView es un componente ligero, como NSStackView, solo para diseño. Debido a esto no se dibuja.

Simplemente coloque el NSGridView en un NSBox y configure su fillColor.

5
catlan 22 oct. 2017 a las 06:57

NSGridView es una subclase de NSView, por lo que hereda todas las propiedades y métodos de NSView incluyendo el dibujo, como se ve en la función draw(_ dirtyRect: NSRect). Asegúrese de incluir un IBOutlet en su controlador de vista o cambie la clase NSGridView en Interface Builder a 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")
    }
}

Básicamente, su controlador de vista no sabe que subclasificó su vista de cuadrícula.

0
Calos 3 feb. 2020 a las 06:06