2009-06-19 52 views
20

Tengo un NSButton en una aplicación Mac cuyo color me gustaría cambiar programáticamente pero nada de lo que probé parece funcionar. Traté de crear una salida en NSButtonCell y establecer el color de fondo allí, pero eso tampoco funcionó. Cualquier fragmento de código sería útil.Cambiar el color de fondo de NSButton

Respuesta

8

Los botones estándar Aqua (forma de píldora) son dibujados por el sistema. No tienen un color de fondo como tal. De hecho, están compuestos por imágenes que Cocoa cose para formar una imagen de botón coherente. Entonces Cocoa no puede volver a colorear las imágenes a su gusto. Solo el botón predeterminado (el que tiene Return configurado como su equivalente de tecla) tendrá un fondo azul pulsante.

Lo que parece que quiere hacer implicará la subclasificación NSButtonCell y hacer su propio dibujo. Si desea volver a colorear las imágenes del botón para obtener el efecto que desea, puede usar la excelente utilidad Theme Park para extraer copias de las imágenes de los botones de Apple y usarlas. Admitiré haber hecho esto yo mismo para "robar" ciertos elementos de la interfaz a los que no se puede acceder de otra manera, como los scrollers de iTunes.

+0

Eso explica por qué no puedo simplemente modificar el fondo ¡El parque temático es una verdadera joya! – aleemb

+0

Cualquier idea sobre cómo hacer esto en Mountain Lion? El parque temático requiere Leopard –

34

Suponiendo que todo esté conectado en IB para su botón sin bordes.

// *.h file 
IBOutlet NSButton* myButton; 

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

Nota de la setBackgroundColor documentación:

"El color de fondo sólo se utiliza en la elaboración de los botones sin bordes."

Si esto no lo hace por usted, entonces tendrá que anular NSButton e implementar el dibujo usted mismo.

Buena suerte.

+0

Este funciona muy bien en la mayoría de mis ventanas. ¿Alguna idea de por qué no funciona en una ventana NSW con una NSToolbar que intercambia NSViews dentro y fuera? Los botones en esos NSViews 'intercambiables' no parecen verse afectados en absoluto por el color de fondo y, sin embargo, puedo cambiar el color del texto de ellos muy bien = ( – valheru

+0

Esto no parece funcionar con rapidez. No lo hice 't ver el método setbackgroundcolor –

+0

Esa propiedad en NSButtonCell todavía está allí en Swift. Debería ser algo como '(button.cell as? NSButtonCell) ?. backgroundColor = NSColor.red' – Mark

-10

UIElement (elemento es de nada igual que Button, vista ....)

UIElement * nombre_var;

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

por ejemplo: UIButton * pButton;

[pButton setBackgroundColor:[UIColor colorWithRed:0.8 green:0.8 blue:0.6 alpha:1.0]]; 
+2

Eso no ayudará con un NSButton –

+2

Lea la pregunta .. Dice NSButton no UIButton – ValayPatel

3

La respuesta de Mark es correcta. Pero si hacerlo por código será complicado para usted, entonces otra forma de hacerlo es configurarlo directamente en el constructor de interfaz.

  1. Encuentra el botón en interfaceBuilder y haz clic en él.
  2. En la sección del navegador de objetos del desarrollador de interfaz, verá que el botón en el que hizo clic tiene un icono de divulgación desplegable. Haz click en eso. Luego le mostrará NSButtonCell del NSButton. Haz click en eso.
  3. Con NSButtonCell seleccionado, haga clic en Identity-Inspector.
  4. En Identity-inspector busque la sección llamada User Defined Runtime Attributes
  5. Haga clic en el pequeño signo más (+) para agregar un valor. El valor mostrará tener 3 propiedades. (A) keyPath (B) Tipo (C) Valor
  6. Cambiar el keyPath a: backgroundColor. Cambie el tipo a: Color.Cambie el valor a: cualquiera que sea el color que desee (se mostrará un selector de colores)

Listo.

+0

Lógicamente esto debería funcionar, pero no funcionó para mí. –

+0

Recuerda establecer el botón en sin márgenes. –

+0

- Estoy No digo que esto no funciona (Xcode 8.2.1) pero después de pasar casi una hora en él, no funcionó, no importa lo que haya cambiado, simplemente no funciona – Yatko

4

Aquí hay otra manera posible de hacer esto:

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

Gracias por estos grandes respuestas. He compilado una subclase NSButton que facilita el ajuste de color de fondo, atributos de borde (color, ancho, esquinas) y atributos de título (color, fuente).

Siéntase libre de utilizar: https://github.com/philfung/osx-dudley/blob/master/DudNSButton.swift

+0

Buen trabajo, gracias por compartir esto. Es posible que desee actualizar para la última versión de Swift, ya que parece que ya no se ejecuta –

0

Un método consiste en crear una vista detrás del botón y establecer el color de ello. Esto crea la vista con el mismo marco y coloca el botón en la parte superior de la vista. Utilizo una etiqueta en el botón para asegurarme de que solo agreguemos la vista una vez, por lo que se puede llamar al método repetidamente al dibujar la IU.

He incluido mi código para establecer el color del texto.

cambiar el color y alfa como se desee:

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

He creado una subclase llamada NSButtonFlatButton que hace que sea muy fácil de cambiar de color botón de fondo, color de texto, icono de color, bordes y otros tipos de estilo, desde el Interface Builder:

https://github.com/OskarGroth/FlatButton

FlatButton for macOS

+0

Gracias por el trabajo increíble. Todavía me sorprende la poca personalización que hay para los elementos de la interfaz de usuario de macOS.Por cierto, ¿es posible usar su FlatButton como ToggleButton? –

+0

@SteveBegin Gracias! Sí, hay una opción isMomentary. – Oskar

+0

Increíble trabajo, pero cuando intento agregar íconos a los botones parecen desproporcionados. –

Cuestiones relacionadas