Лучший способ изменить цвет фона для NSView
Я ищу лучший способ изменить backgroundColor
на NSView
. Я также хотел бы иметь возможность установить соответствующий alpha
маска NSView
. Что-то вроде:
myView.backgroundColor = [NSColor colorWithCalibratedRed:0.227f
green:0.251f
blue:0.337
alpha:0.8];
я заметил, что NSWindow
имеет этот метод, и я не большой поклонник NSColorWheel
или NSImage
параметры фона, но если они являются лучшими, готовы использовать.
15 ответов:
Да, ваш собственный ответ был правильный. Вы также можете использовать методы какао:
- (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) NSColor(red: 0x1d/244, green: 0x16/255, blue: 0x1d/255, alpha: 1).setFill() dirtyRect.fill() } }
простым и эффективным решением является Настройка представления для использования основного слоя анимации в качестве его резервного хранилища. Тогда вы можете использовать
-[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; }
вот именно!
Если вы любитель раскадровки, вот способ, которым вы не нужно никакой строки кода.
добавить
NSBox
в качестве подвида для NSView и настроить кадр NSBox, как то же самое с NSView.в раскадровке или XIB измените позицию заголовка на None, введите поле в Custom, тип границы "нет", и цвет границы, чтобы все, что вам нравится.
здесь скриншот:
вот результат:
Если вы сначала установите для параметра wantslayer значение YES, вы можете напрямую управлять фоном слоя.
[self.view setWantsLayer:YES]; [self.view.layer setBackgroundColor:[[NSColor whiteColor] CGColor]];
думаю, я понял, как это сделать:
- (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)); }
Я прошел через все эти ответы, и ни один из них не работал для меня, к сожалению. Тем не менее, я нашел этот чрезвычайно простой способ, примерно через час поиска : )
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); } }
В Swift:
override func drawRect(dirtyRect: NSRect) { NSColor.greenColor().setFill() NSRectFill(dirtyRect) super.drawRect(dirtyRect) }
я протестировал следующее, И это сработало для меня (в Swift):
view.wantsLayer = true view.layer?.backgroundColor = NSColor.blackColor().colorWithAlphaComponent(0.5).CGColor
в Swift 3, Вы можете создать расширение для этого:
extension NSView { func setBackgroundColor(_ color: NSColor) { wantsLayer = true layer?.backgroundColor = color.cgColor } } // how to use btn.setBackgroundColor(NSColor.gray)
используйте NSBox, который является подклассом NSView, что позволяет нам легко стилизовать
Swift 3
let box = NSBox() box.boxType = .custom box.fillColor = NSColor.red box.cornerRadius = 5
посмотреть RMSkinnedView. Вы можете установить цвет фона NSView из Interface Builder.
в swift вы можете подкласс 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