Подтвердить что ты не робот

Изменить цвет фона NSButton

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

// *.h file
IBOutlet NSButton* myButton;

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

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

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

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

Удачи.

Ответ 3

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

    let button = NSButton()
    button.title = ""
    button.bezelStyle = .texturedSquare
    button.isBordered = false //Important
    button.wantsLayer = true
    button.layer?.backgroundColor = NSColor.red.cgColor

Ответ 4

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

https://github.com/OskarGroth/FlatButton

FlatButton for macOS

Ответ 5

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

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

Готово.

Ответ 6

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

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

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

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

Ответ 7

Swift 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)

Ответ 8

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

(button.cell as! NSButtonCell).isBordered = false
(button.cell as! NSButtonCell).backgroundColor = .white

Ответ 9

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

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

Ответ 10

Если кто-то сталкивается с проблемой при настройке раскадровки, то для проверки ссылок: вы можете установить свойства непосредственно в NSButton, как показано ниже

: enter image description here

Результат:
enter image description here

Ответ 11

UIElement (Элемент имеет что-либо вроде кнопки, view....)

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]];