Изменить цвет фона NSButton - PullRequest
24 голосов
/ 19 июня 2009

У меня есть NSButton в приложении Mac, цвет которого я хотел бы изменить программно, но, похоже, ничего из того, что я пробовал, не работает. Я попытался создать вывод на NSButtonCell и установить там цвет фона, но это тоже не сработало. Любые фрагменты кода будут полезны.

Ответы [ 10 ]

37 голосов
/ 19 июня 2009

Предположим, что все подключено в IB для кнопки без полей.

// *.h file
IBOutlet NSButton* myButton;

// *.m file
[[myButton cell] setBackgroundColor:[NSColor redColor]];

Примечание из документации setBackgroundColor :

"Цвет фона используется только при рисовании кнопок без полей."

Если это не поможет вам, вам нужно переопределить NSButton и реализовать чертеж самостоятельно.

Удачи.

10 голосов
/ 13 марта 2017

Вот еще один возможный способ сделать это:

    let button = NSButton()
    button.title = ""
    button.bezelStyle = .texturedSquare
    button.isBordered = false //Important
    button.wantsLayer = true
    button.layer?.backgroundColor = NSColor.red.cgColor
10 голосов
/ 19 июня 2009

Стандартные кнопки Aqua (таблетки) нарисованы системой. У них нет цвета фона как такового. Фактически, они состоят из изображений, которые Какао сшивает вместе, чтобы сделать связное изображение кнопки. Так что какао не может перекрасить изображения по своему вкусу. Только кнопка по умолчанию (та, для которой в качестве эквивалента ключа задано значение Return) будет иметь синий пульсирующий фон.

То, что вы хотите сделать, будет включать в себя создание подкласса NSButtonCell и создание собственного рисунка. Если вы хотите перекрасить изображения кнопок, чтобы получить желаемый эффект, вы можете использовать отличную утилиту Theme Park , чтобы извлекать копии изображений кнопок Apple и использовать их. Я признаю, что сделал это сам, чтобы «украсть» некоторые элементы интерфейса, которые иначе недоступны, такие как скроллеры из iTunes.

5 голосов
/ 22 апреля 2017

Я создал подкласс NSButton с именем FlatButton, который позволяет очень легко изменять цвет фона кнопки, цвет текста, цвет значка, границы и другие типы стилей из Interface Builder:

https://github.com/OskarGroth/FlatButton

FlatButton for macOS

3 голосов
/ 26 октября 2015

Марк ответ правильный. Но если делать это с помощью кода будет для вас беспорядочно, то другой способ сделать это - установить его прямо в конструкторе интерфейсов.

  1. Найдите кнопку в interfaceBuilder и нажмите на нее.
  2. В разделе обозревателя объектов конструктора интерфейса вы увидите, что кнопка, на которую вы нажали, имеет значок раскрывающегося списка. Нажмите здесь. Затем он покажет вам NSButtonCell NSButton. Нажмите на него.
  3. Выбрав NSButtonCell, нажмите на Identity-Inspector.
  4. В Идентификационном инспекторе ищите раздел под названием User Defined Runtime Attributes
  5. Нажмите на маленький знак плюс (+), чтобы добавить значение. Значение будет иметь 3 свойства. (A) keyPath (B) Тип (C) Значение
  6. Измените keyPath на: backgroundColor. Измените тип на: Color. Измените значение на: какой цвет вы хотите (будет отображаться палитра цветов)

Готово.

1 голос
/ 06 марта 2019

Свифт 4. Предыдущий ответ помог мне. Спасибо.

extension NSButton {

    public func setText(text: String, color: NSColor, font: NSFont) {

        let paragraphStyle = NSMutableParagraphStyle.init()
        paragraphStyle.alignment = .center
        let range = NSRange.init(location: 0, length: (text.lengthOfBytes(using: String.Encoding.utf8)))
        let attributedTitle = NSMutableAttributedString.init(string: text)
        attributedTitle.addAttribute( NSAttributedString.Key.paragraphStyle, value: paragraphStyle, range: range)
        attributedTitle.addAttribute(NSAttributedString.Key.foregroundColor, value: color, range: range)
        attributedTitle.addAttribute(NSAttributedString.Key.font, value: font, range: range)
        self.attributedTitle = attributedTitle
    }

    public func setBackground(color: NSColor, radius: CGFloat = 2.0) {
        self.wantsLayer = true
        self.isBordered = false
        self.layer?.backgroundColor = color.cgColor
        self.layer?.cornerRadius = radius
    }

}

Как использовать для настройки NSButton с помощью IBOutlet:

refreshButton.setText(text: "REFRESH", color: .white, font: .systemFont(ofSize: 13))
refreshButton.setBackground(color: .red, radius: 2.0)
1 голос
/ 13 апреля 2017

Один из способов - создать вид за кнопкой и установить его цвет. Это создает вид с той же рамкой и помещает кнопку поверх вида. Я использую тег на кнопке, чтобы убедиться, что мы добавляем представление только один раз, поэтому метод можно вызывать повторно при рисовании интерфейса.

Я включил свой код для установки цвета текста.

Измените цвет и альфа по желанию:

NSColor *colour = [NSColor colorWithRed:0.0 green:0.0 blue:1.0 alpha:0.5] ;
[self styleButton:button colour:colour] ;

-(void) styleButton:(NSButton *)button colour:(NSColor *)colour {

    [self setButton:button fontColor:[NSColor whiteColor]];

    if(button.tag == 9901) return ;

    button.bezelStyle = NSBezelStyleTexturedSquare ;
    [button setBordered:NO];

    NSView *b2 = [[NSView alloc] initWithFrame:button.frame] ;
    [button.superview addSubview:b2] ;

    b2.layer.backgroundColor = colour.CGColor;

    [button removeFromSuperview];
    [b2.superview addSubview:button];

    button.tag = 9901 ;
}

-(void) setButton:(NSButton *)button fontColor:(NSColor *)color {
    NSMutableAttributedString *colorTitle = [[NSMutableAttributedString alloc] initWithAttributedString:[button attributedTitle]];
    [colorTitle addAttribute:NSForegroundColorAttributeName value:color range:NSMakeRange(0, button.attributedTitle.length)];
    [button setAttributedTitle:colorTitle];
}
0 голосов
/ 30 апреля 2019

В Swift вы можете сделать так:

(button.cell as! NSButtonCell).isBordered = false
(button.cell as! NSButtonCell).backgroundColor = .white
0 голосов
/ 11 апреля 2017

Спасибо за эти великолепные ответы. Я скомпилировал подкласс NSButton, который позволяет легко устанавливать цвет фона, атрибуты границ (цвет, ширина, углы) и атрибуты заголовка (цвет, шрифт).

Не стесняйтесь использовать: https://github.com/philfung/osx-dudley/blob/master/DudNSButton.swift

0 голосов
/ 27 июля 2010

UIElement (Элемент любого типа, как кнопка, вид ....)

UIElement * varname;

[varname setBackgroundColor:[UIColor colorWithRed:0.8 green:0.8 blue:0.6 alpha:1.0]];

например: UIButton * pButton;

[pButton setBackgroundColor:[UIColor colorWithRed:0.8 green:0.8 blue:0.6 alpha:1.0]];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...