objective-c macos nsbutton textcolor

objective c - NSButton cómo colorear el texto



objective-c macos (9)

en OSX tengo un botón NS con una imagen bastante oscura y desafortunadamente no es posible cambiar el color usando el inspector de atributos. Vea la imagen del gran botón negro, el texto es Ir .

¿Alguna pista para la posibilidad de cambiar el color del texto? Busqué en la clase NSButton pero no hay un método para hacerlo. Soy consciente de que podría hacer la imagen con una fuente blanca, pero eso no es lo que quiero hacer.

Saludos desde Suiza, Ronald Hofmann ---


Agregue una categoría en el NSButton y simplemente configure el color según lo que desee, y presente los atributos existentes, ya que el título puede centrarse, alinearse a la izquierda, etc.


@implementation NSButton (NSButton_IDDAppKit) - (NSColor*)titleTextColor { return [NSColor redColor]; } - (void)setTitleTextColor:(NSColor*)aColor { NSMutableAttributedString* attributedString = [[NSMutableAttributedString alloc] initWithAttributedString:self.attributedTitle]; NSString* title = self.title; NSRange range = NSMakeRange(0.0, self.title.length); [attributedString addAttribute:NSForegroundColorAttributeName value:aColor range:range]; [self setAttributedTitle:attributedString]; [attributedString release]; } @end


Apple tiene un código para configurar el color del texto de un botón NSB como parte del ejemplo de Popover .

A continuación se muestra el quid del ejemplo (modificado ligeramente para esta publicación, sin probar):

NSButton *button = ...; NSMutableAttributedString *attrTitle = [[NSMutableAttributedString alloc] initWithString:@"Make Me Red"]; NSUInteger len = [attrTitle length]; NSRange range = NSMakeRange(0, len); [attrTitle addAttribute:NSForegroundColorAttributeName value:[NSColor redColor] range:range]; [attrTitle fixAttributesInRange:range]; [button setAttributedTitle:attrTitle];

Tenga en cuenta que la llamada a fixAttributesInRange: parece ser importante (una extensión de AppKit), pero no puedo encontrar documentación sobre por qué ese es el caso. La única preocupación que tengo con el uso de cadenas atribuidas en un NSButton es si también se define una imagen para el botón (como un icono), la cadena atribuida ocupará un rectángulo grande y empujará la imagen hasta el borde del botón. Algo a tener en cuenta.

De lo contrario, parece que la mejor manera es hacer su propio drawRect: override, que tiene muchos otros escollos que están fuera del alcance de esta pregunta.


Aquí hay otras dos soluciones: http://denis-druz.okis.ru/news.534557.Text-Color-in-NSButton.html

solución 1:

-(void)awakeFromNib { NSColor *color = [NSColor greenColor]; NSMutableAttributedString *colorTitle = [[NSMutableAttributedString alloc] initWithAttributedString:[button attributedTitle]]; NSRange titleRange = NSMakeRange(0, [colorTitle length]); [colorTitle addAttribute:NSForegroundColorAttributeName value:color range:titleRange]; [button setAttributedTitle:colorTitle]; }

solución 2:

en el archivo * .m:

- (void)setButtonTitleFor:(NSButton*)button toString:(NSString*)title withColor:(NSColor*)color { NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init]; [style setAlignment:NSCenterTextAlignment]; NSDictionary *attrsDictionary = [NSDictionary dictionaryWithObjectsAndKeys:color, NSForegroundColorAttributeName, style, NSParagraphStyleAttributeName, nil]; NSAttributedString *attrString = [[NSAttributedString alloc]initWithString:title attributes:attrsDictionary]; [button setAttributedTitle:attrString]; } -(void)awakeFromNib { NSString *title = @"+Add page"; NSColor *color = [NSColor greenColor]; [self setButtonTitleFor:button toString:title withColor:color]; }


Así es como lo hago en Swift 4.

@IBOutlet weak var myButton: NSButton! // create the attributed string let myString = "My Button Title" let myAttribute = [ NSAttributedStringKey.foregroundColor: NSColor.blue ] let myAttrString = NSAttributedString(string: myString, attributes: myAttribute) // assign it to the button myButton.attributedTitle = myAttrString


He creado una subclase de NSButton llamada FlatButton que hace que sea muy fácil cambiar el color del texto en el inspector de atributos de Interface Builder, como usted lo solicita. Debe proporcionar una solución simple y extensa a su problema.

También expone otros atributos de estilo relevantes, como el color y la forma.

Lo encontrarás aquí: https://github.com/OskarGroth/FlatButton


Mi solución:

.h IB_DESIGNABLE @interface DVButton : NSButton @property (nonatomic, strong) IBInspectable NSColor *BGColor; @property (nonatomic, strong) IBInspectable NSColor *TextColor; @end .m @implementation DVButton - (void)awakeFromNib { if (self.TextColor) { NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init]; [style setAlignment:NSCenterTextAlignment]; NSDictionary *attrsDictionary = [NSDictionary dictionaryWithObjectsAndKeys: self.TextColor, NSForegroundColorAttributeName, self.font, NSFontAttributeName, style, NSParagraphStyleAttributeName, nil]; NSAttributedString *attrString = [[NSAttributedString alloc]initWithString:self.title attributes:attrsDictionary]; [self setAttributedTitle:attrString]; } } - (void)drawRect:(NSRect)dirtyRect { if (self.BGColor) { // add a background colour [self.BGColor setFill]; NSRectFill(dirtyRect); } [super drawRect:dirtyRect]; } @end

Y aquí hay una versión Swift 3:

import Cocoa @IBDesignable class DVButton: NSButton { @IBInspectable var bgColor: NSColor? @IBInspectable var textColor: NSColor? override func awakeFromNib() { if let textColor = textColor, let font = font { let style = NSMutableParagraphStyle() style.alignment = .center let attributes = [ NSForegroundColorAttributeName: textColor, NSFontAttributeName: font, NSParagraphStyleAttributeName: style ] as [String : Any] let attributedTitle = NSAttributedString(string: title, attributes: attributes) self.attributedTitle = attributedTitle } } override func draw(_ dirtyRect: NSRect) { if let bgColor = bgColor { bgColor.setFill() NSRectFill(dirtyRect) } super.draw(dirtyRect) } }

y la versión Swift 4.0:

import Cocoa @IBDesignable class Button: NSButton { @IBInspectable var bgColor: NSColor? @IBInspectable var textColor: NSColor? override func awakeFromNib() { if let textColor = textColor, let font = font { let style = NSMutableParagraphStyle() style.alignment = .center let attributes = [ NSAttributedStringKey.foregroundColor: textColor, NSAttributedStringKey.font: font, NSAttributedStringKey.paragraphStyle: style ] as [NSAttributedStringKey : Any] let attributedTitle = NSAttributedString(string: title, attributes: attributes) self.attributedTitle = attributedTitle } } override func draw(_ dirtyRect: NSRect) { if let bgColor = bgColor { bgColor.setFill() __NSRectFill(dirtyRect) } super.draw(dirtyRect) } }


Una solución realmente simple y reutilizable sin subclasificar NSButton:

[self setButton:self.myButton fontColor:[NSColor whiteColor]] ; -(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]; }


Usando la información anterior, escribí una extensión de NSButton que establece el color de primer plano, junto con la fuente del sistema y la alineación del texto.

Esto es para Cocoa en Swift 4.x, pero podría ajustarse fácilmente para iOS.

import Cocoa extension NSButton { func setAttributes(foreground: NSColor? = nil, fontSize: CGFloat = -1.0, alignment: NSTextAlignment? = nil) { var attributes: [NSAttributedStringKey: Any] = [:] if let foreground = foreground { attributes[NSAttributedStringKey.foregroundColor] = foreground } if fontSize != -1 { attributes[NSAttributedStringKey.font] = NSFont.systemFont(ofSize: fontSize) } if let alignment = alignment { let paragraph = NSMutableParagraphStyle() paragraph.alignment = alignment attributes[NSAttributedStringKey.paragraphStyle] = paragraph } let attributed = NSAttributedString(string: self.title, attributes: attributes) self.attributedTitle = attributed } }


NSColor color = NSColor.White; NSMutableAttributedString colorTitle = new NSMutableAttributedString (cb.Cell.Title); NSRange titleRange = new NSRange (0, (nint)cb.Cell.Title.Length); colorTitle.AddAttribute (NSStringAttributeKey.ForegroundColor, color, titleRange); cb.Cell.AttributedTitle = colorTitle;