web-dev-qa-db-fra.com

Meilleure façon de changer la couleur de fond pour un NSView

Je cherche le meilleur moyen de changer le backgroundColor d'un NSView. J'aimerais aussi pouvoir définir le masque alpha approprié pour le NSView. Quelque chose comme:

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

Je remarque que NSWindow utilise cette méthode et je ne suis pas un grand fan des options d'arrière-plan NSColorWheel ou NSImage, mais si elles sont les meilleures, elles sont prêtes à être utilisées. .

140
BadPirate

Oui, ta propre réponse était juste. Vous pouvez également utiliser les méthodes Cocoa:

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

En rapide:

class MyView: NSView {

    override func draw(_ dirtyRect: NSRect) {
        super.draw(dirtyRect)

        // #1d161d
        NSColor(red: 0x1d/255, green: 0x16/255, blue: 0x1d/255, alpha: 1).setFill()
        dirtyRect.fill()
    }

}
130
mohsenr

Une solution simple et efficace consiste à configurer la vue pour utiliser une couche Core Animation en tant que magasin de support. Ensuite, vous pouvez utiliser -[CALayer setBackgroundColor:] pour définir la couleur d'arrière-plan du calque.

- (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;
}

C'est ça!

113
loretoparisi

Si vous êtes un amoureux du story-board, voici une façon de ne pas avoir besoin d'une ligne de code .

Ajoutez NSBox en tant que sous-vue à NSView et ajustez le cadre de NSBox de la même manière avec NSView.

Dans Storyboard ou XIB, modifiez la position du titre sur Aucune, le type de boîte sur Personnalisé , le type de bordure sur "Aucun" et la couleur de bordure à votre guise.

Voici une capture d'écran:

enter image description here

Voici le résultat:

enter image description here

70
JZAU

Si vous définissez d'abord WantsLayer sur YES, vous pouvez manipuler directement l'arrière-plan du calque.

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

Je pense avoir compris comment faire:

- (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));
}
26
BadPirate

J'ai parcouru toutes ces réponses et aucune d'entre elles n'a malheureusement fonctionné pour moi. Cependant, j’ai trouvé ce moyen extrêmement simple, après environ une heure de recherche:)

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

modifier/mettre à jour: 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
        }
    }
}

usage:

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)
20
Leo Dabus

Meilleure solution :

- (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);
    }
}
7
Nagaraj

Sans doute le moyen le plus simple, également compatible avec les atouts Color Set:

Swift:

view.setValue(NSColor.white, forKey: "backgroundColor")

Objective-C:

[view setValue: NSColor.whiteColor forKey: "backgroundColor"];

Interface Builder:

Ajoutez un attribut défini par l'utilisateur backgroundColor dans le générateur d'interface, de type NSColor.

5
Ely

En rapide:

override func drawRect(dirtyRect: NSRect) {

    NSColor.greenColor().setFill()
    NSRectFill(dirtyRect)

    super.drawRect(dirtyRect)
}
5
Ixx

Utilisez NSBox, qui est une sous-classe de NSView, nous permettant de styler facilement

Swift 3

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

J'ai testé les éléments suivants et cela a fonctionné pour moi (en Swift):

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

Dans Swift 3, vous pouvez créer une extension pour le faire:

extension NSView {
    func setBackgroundColor(_ color: NSColor) {
        wantsLayer = true
        layer?.backgroundColor = color.cgColor
    }
}

// how to use
btn.setBackgroundColor(NSColor.gray)
3
Kaiyuan Xu

Dans Swift vous pouvez sous-classer NSView et le faire

class MyView:NSView {
    required init?(coder: NSCoder) {
        super.init(coder: coder);

        self.wantsLayer = true;
        self.layer?.backgroundColor = NSColor.redColor().CGColor;
    }
}
1
Chad Scira

Regardez RMSkinnedView . Vous pouvez définir la couleur d'arrière-plan de NSView à partir d'Interface Builder.

1
Raffael

Juste une petite classe réutilisable (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
1
Vlad

Ceci prend en charge la modification de l'apparence globale du système (activation ou désactivation du mode sombre) pendant l'exécution de l'application. Vous pouvez également définir la couleur d'arrière-plan dans Interface Builder, si vous définissez d'abord la classe de la vue sur BackgroundColorView.


class BackgroundColorView: NSView {
    @IBInspectable var backgroundColor: NSColor? {
        didSet { needsDisplay = true }
    }

    override init(frame frameRect: NSRect) {
        super.init(frame: frameRect)
        wantsLayer = true
    }

    required init?(coder decoder: NSCoder) {
        super.init(coder: decoder)
        wantsLayer = true
    }

    override var wantsUpdateLayer: Bool { return true }

    override func updateLayer() {
        layer?.backgroundColor = backgroundColor?.cgColor
    }
}
0
kareman