objective-c macos background-color nsview

objective c - La mejor forma de cambiar el color de fondo de un NSView



objective-c macos (15)

Creo que descubrí cómo hacerlo:

- (void)drawRect:(NSRect)dirtyRect { // Fill in background Color CGContextRef context = (CGContextRef) [[NSGraphicsContext currentContext] graphicsPort]; CGContextSetRGBFillColor(context, 0.227,0.251,0.337,0.8); CGContextFillRect(context, NSRectToCGRect(dirtyRect)); }

Estoy buscando la mejor manera de cambiar el NSView de backgroundColor de un NSView . También me gustaría poder establecer la máscara alpha apropiada para NSView . Algo como:

myView.backgroundColor = [NSColor colorWithCalibratedRed:0.227f green:0.251f blue:0.337 alpha:0.8];

NSWindow que NSWindow tiene este método, y no soy un gran admirador de las opciones de fondo de NSImage o NSImage , pero si son las mejores, están dispuestas a usarlas.


Echa un vistazo a RMSkinnedView . Puede establecer el color de fondo de NSView desde Interface Builder.


En Swift 3, puede crear una extensión para hacerlo:

extension NSView { func setBackgroundColor(_ color: NSColor) { wantsLayer = true layer?.backgroundColor = color.cgColor } } // how to use btn.setBackgroundColor(NSColor.gray)


En Swift:

override func drawRect(dirtyRect: NSRect) { NSColor.greenColor().setFill() NSRectFill(dirtyRect) super.drawRect(dirtyRect) }


Mejor solución :

- (id)initWithFrame:(NSRect)frame { self = [super initWithFrame:frame]; if (self) { self.wantsLayer = YES; } return self; } - (void)awakeFromNib { float r = (rand() % 255) / 255.0f; float g = (rand() % 255) / 255.0f; float b = (rand() % 255) / 255.0f; if(self.layer) { CGColorRef color = CGColorCreateGenericRGB(r, g, b, 1.0f); self.layer.backgroundColor = color; CGColorRelease(color); } }


Probé lo siguiente y funcionó para mí (en Swift):

view.wantsLayer = true view.layer?.backgroundColor = NSColor.blackColor().colorWithAlphaComponent(0.5).CGColor


Rápidamente puede subclase NSView y hacer esto

class MyView:NSView { required init?(coder: NSCoder) { super.init(coder: coder); self.wantsLayer = true; self.layer?.backgroundColor = NSColor.redColor().CGColor; } }


Revisé todas estas respuestas y ninguna de ellas funcionó para mí, desafortunadamente. Sin embargo, encontré esta manera extremadamente simple, después de aproximadamente una hora de búsqueda:)

myView.layer.backgroundColor = CGColorCreateGenericRGB(0, 0, 0, 0.9);


Sí, tu propia respuesta fue correcta. También puedes usar métodos de cacao:

- (void)drawRect:(NSRect)dirtyRect { // set any NSColor for filling, say white: [[NSColor whiteColor] setFill]; NSRectFill(dirtyRect); [super drawRect:dirtyRect]; }


Si eres un amante del guión gráfico, aquí hay una forma en la que no necesitas ninguna línea de código .

Agregue NSBox como subvista a NSView y ajuste el marco de NSBox como lo mismo con NSView.

En Storyboard o XIB, cambie la posición del título a Ninguno, Tipo de cuadro a Personalizado , Tipo de borde a "Ninguno" y Color de borde a lo que quiera.

Aquí hay una captura de pantalla:

Este es el resultado:


Si estableceWantsLayer en SÍ primero, puede manipular directamente el fondo de la capa.

[self.view setWantsLayer:YES]; [self.view.layer setBackgroundColor:[[NSColor whiteColor] CGColor]];


Solo clase pequeña reutilizable (Swift 4.1)

class View: NSView { var backgroundColor: NSColor? convenience init() { self.init(frame: NSRect()) } override func draw(_ dirtyRect: NSRect) { if let backgroundColor = backgroundColor { backgroundColor.setFill() dirtyRect.fill() } else { super.draw(dirtyRect) } } } // Usage let view = View() view.backgroundColor = .white


Una solución fácil y eficiente es configurar la vista para usar una capa Core Animation como su almacén de respaldo. Luego puede usar -[CALayer setBackgroundColor:] para establecer el color de fondo de la capa.

- (void)awakeFromNib { self.wantsLayer = YES; // NSView will create a CALayer automatically } - (BOOL)wantsUpdateLayer { return YES; // Tells NSView to call `updateLayer` instead of `drawRect:` } - (void)updateLayer { self.layer.backgroundColor = [NSColor colorWithCalibratedRed:0.227f green:0.251f blue:0.337 alpha:0.8].CGColor; }

¡Eso es!


Use NSBox, que es una subclase de NSView, que nos permite diseñar fácilmente

Swift 3

let box = NSBox() box.boxType = .custom box.fillColor = NSColor.red box.cornerRadius = 5


editar / actualizar: Xcode 8.3.1 • Swift 3.1

extension NSView { var backgroundColor: NSColor? { get { guard let color = layer?.backgroundColor else { return nil } return NSColor(cgColor: color) } set { wantsLayer = true layer?.backgroundColor = newValue?.cgColor } } }

uso:

let myView = NSView(frame: NSRect(x: 0, y: 0, width: 100, height: 100)) print(myView.backgroundColor ?? "none") // NSView''s background hasn''t been set yet = nil myView.backgroundColor = .red // set NSView''s background color to red color print(myView.backgroundColor ?? "none") view.addSubview(myView)