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. .
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()
}
}
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!
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:
Voici le résultat:
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]];
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));
}
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);
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)
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);
}
}
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
.
En rapide:
override func drawRect(dirtyRect: NSRect) {
NSColor.greenColor().setFill()
NSRectFill(dirtyRect)
super.drawRect(dirtyRect)
}
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
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
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)
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;
}
}
Regardez RMSkinnedView . Vous pouvez définir la couleur d'arrière-plan de NSView à partir d'Interface Builder.
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
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
}
}