web-dev-qa-db-ja.com

NSViewの背景色を変更する最良の方法

backgroundColorNSViewを変更する最良の方法を探しています。また、alphaに適切なNSViewマスクを設定できるようにしたいと思います。何かのようなもの:

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

NSWindowにはこのメソッドがあり、NSColorWheel、またはNSImageバックグラウンドオプションの大ファンではないことに気付きますが、それらが最適な場合は喜んで使用します。

140
BadPirate

ええ、あなた自身の答えは正しかったです。 Cocoaメソッドも使用できます。

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

Swiftの場合:

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

簡単で効率的なソリューションは、バッキングストアとしてCore Animationレイヤーを使用するようにビューを構成することです。次に、-[CALayer setBackgroundColor:]を使用して、レイヤーの背景色を設定できます。

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

それでおしまい!

113
loretoparisi

あなたが絵コンテ好きなら、ここにコードの行を一切必要としない方法があります

NSViewにサブビューとしてNSBoxを追加し、NSViewの場合と同じようにNSBoxのフレームを調整します。

ストーリーボードまたはXIBで、タイトルの位置を[なし]に変更し、ボックスタイプをCustomに変更し、境界線タイプを[なし]に変更し、境界線の色を任意に変更します。

これがスクリーンショットです:

enter image description here

これが結果です:

enter image description here

70
JZAU

最初にWantsLayerをYESに設定すると、レイヤーの背景を直接操作できます。

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

私はそれを行う方法を考え出したと思う:

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

私はこれらの答えをすべて調べましたが、残念ながら私にとってはうまくいきませんでした。しかし、約1時間の検索の後、この非常に簡単な方法を見つけました:)

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

編集/更新: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
        }
    }
}

使用法:

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

ベストソリューション:

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

間違いなく最も簡単な方法で、カラーセットアセットとも互換性があります。

Swift

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

Objective-C

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

インターフェイスビルダー

タイプbackgroundColorのユーザー定義属性NSColorをインターフェースビルダーに追加します。

5
Ely

Swiftの場合:

override func drawRect(dirtyRect: NSRect) {

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

    super.drawRect(dirtyRect)
}
5
Ixx

NSViewのサブクラスであるNSBoxを使用して、簡単にスタイルを設定できます

スイフト3

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

私は次をテストし、それは私のために働いた(Swiftで):

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

Swift 3では、それを行うための拡張機能を作成できます。

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

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

Swiftでは、NSViewをサブクラス化してこれを行うことができます

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

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

RMSkinnedView をご覧ください。 NSViewの背景色は、Interface Builder内から設定できます。

1
Raffael

ほんの小さな再利用可能なクラス(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

これにより、アプリケーションの実行中にシステム全体の外観を変更する(ダークモードをオンまたはオフにする)ことができます。ビューのクラスを最初にBackgroundColorViewに設定した場合、Interface Builderで背景色を設定することもできます。


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