как установить цвет фона NSButton OSX

Я хочу установить цвет фона NSButton. В инспекторе атрибутов ничего не было, поэтому мне было интересно, есть ли способ сделать это программно?


person Zeist    schedule 01.04.2015    source источник


Ответы (4)


Системные элементы управления должны соответствовать внешнему виду Apple, поэтому вы не сможете легко изменить цвет фона. Если вы хотите добиться этого, вам нужно создать подкласс NSButton и перезаписать метод drawRect:. Недостатком является то, что вам также нужно обрабатывать текстовый рисунок и, возможно, другой рендеринг в зависимости от состояния кнопки.

Редактировать. На самом деле вам нужно создать подкласс класса NSButtonCell для рисования, дополнительную информацию можно найти здесь: https://developer.apple.com/library/prerelease/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSButtonCell_Class/index.html#//apple_ref/doc/uid/20000093-SW15

person Cristik    schedule 01.04.2015

Помимо подкласса, вы можете использовать подход уровня, подобный этому

NSButton *button = [[NSButton alloc] initWithFrame:frame];
[superView addSubView:button];
[button setWantsLayer:YES];
button.layer.backgroundColor = [NSColor blueColor].CGColor;

или вы можете создать изображение с указанным цветом и применить это изображение к кнопке.

person Sheen Vempeny    schedule 01.04.2015
comment
Но теперь цвет кнопки не меняется при нажатии. - person Shizam; 04.11.2016

Я бы рекомендовал не создавать подклассы ячеек. Ячейки устарели и находятся на выходе.

NSButton позволяет установить изображение без рамки.

Создание подклассов NSView или NSControl, выполнение пользовательского рисования и отслеживание состояний событий мыши и активное/активное окно приложения для рисования всех пользовательских состояний столь же эффективно, если не лучше.

Ячейки не знают об AutoLayout, поэтому вам следует быть осторожным, если вы переходите на ячейку.

person uchuugaka    schedule 01.04.2015

Используйте фоновый слой NSButton следующим образом:

buttonName.layer.backgroundColor = NSColor.redColor.CGColor;
person Community    schedule 02.04.2015
comment
Это будет работать только в том случае, если вы сделаете кнопку прозрачной, что также приведет к потере метки заголовка. - person Phil Andrews; 13.06.2016