Answers:
是的,您自己的答案是正确的。您还可以使用可可方法:
- (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()
}
}
一个简单,有效的解决方案是将视图配置为使用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;
}
而已!
setLayer:
或setWantsLayer:
中断应用程序中可能包含的任何WebView!(即使在不同的窗口中……)
setWantsLayer:
中定义:在使用层支持的视图时,永远不要直接与层交互。when setWantsLayer:
和setLayer:
被调用的顺序是相关的。
如果您是情节提要的爱好者,那么可以通过这种方式不需要任何代码行。
添加NSBox
为NSView的子视图,并调整NSBox的框架,使其与NSView相同。
在情节提要或XIB中,将“标题”位置更改为“无”,将“ 框类型”更改为“ 自定义 ”,将“边框类型” 更改为“无”,并将“边框颜色”更改为任何您喜欢的颜色。
这是屏幕截图:
结果如下:
想想我想出了怎么做:
- (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));
}
CGContextFillRect(context, NSRectToCGRect(dirtyRect));
可以编辑答案吗?
我经历了所有这些答案,不幸的是没有一个对我有用。但是,经过大约一个小时的搜索,我发现了这种极其简单的方法:)
myView.layer.backgroundColor = CGColorCreateGenericRGB(0, 0, 0, 0.9);
编辑/更新: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)
最佳解决方案:
- (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);
}
}
使用NSBox,它是NSView的子类,使我们可以轻松地设置样式
迅捷3
let box = NSBox()
box.boxType = .custom
box.fillColor = NSColor.red
box.cornerRadius = 5
我测试了以下内容,并且对我有用(在Swift中):
view.wantsLayer = true
view.layer?.backgroundColor = NSColor.blackColor().colorWithAlphaComponent(0.5).CGColor
看看RMSkinnedView。您可以在Interface Builder中设置NSView的背景颜色。
您可以迅速将NSView子类化并执行此操作
class MyView:NSView {
required init?(coder: NSCoder) {
super.init(coder: coder);
self.wantsLayer = true;
self.layer?.backgroundColor = NSColor.redColor().CGColor;
}
}
很小的可重用类(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
只需backgroundColor
在图层上设置(使视图图层为后备)。
view.wantsLayer = true
view.layer?.backgroundColor = CGColor.white
这支持在应用程序运行时更改系统范围的外观(打开或关闭暗模式)。如果先将视图的类设置为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
}
}
NSRectFill
用于NSCompositeCopy
填充,因此它会掩盖其后的所有内容-不会在任何祖先视图的顶部合成。对于具有部分(或完全)透明颜色的填充,请在操作中使用NSRectFillUsingOperation
developer.apple.com/mac/library/documentation/Cocoa/Reference/…NSCompositeSourceOver
。