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)