OSX では、かなり暗い画像の NSButton がありますが、残念ながら、属性インスペクターを使用して色を変更することはできません。写真の大きな黒いボタンを参照してください。テキストはGoです。
テキストの色を変更する可能性の手がかりはありますか? 私は NSButton クラスを調べましたが、それを行う方法はありません。白いフォントで画像を作成できることは承知していますが、それは私がやりたいことではありません。
スイスからのご挨拶、ロナルド・ホフマン ---
OSX では、かなり暗い画像の NSButton がありますが、残念ながら、属性インスペクターを使用して色を変更することはできません。写真の大きな黒いボタンを参照してください。テキストはGoです。
テキストの色を変更する可能性の手がかりはありますか? 私は NSButton クラスを調べましたが、それを行う方法はありません。白いフォントで画像を作成できることは承知していますが、それは私がやりたいことではありません。
スイスからのご挨拶、ロナルド・ホフマン ---
私の解決策:
.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
そして、これが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)
}
}
および 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)
}
}
Apple には、ポップオーバーの例の一部として NSButton のテキストの色を設定するためのコードがあります。
以下は、例の要点です (この投稿用にわずかに変更され、テストされていません)。
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];
への呼び出しは重要 (AppKit 拡張機能) のように思われますが、その理由fixAttributesInRange:
に関するドキュメントが見つからないことに注意してください。NSButton で属性付きの文字列を使用する際に私が持っている唯一の懸念は、ボタン (アイコンなど) に対して画像も定義されている場合、属性付きの文字列が大きな四角形を占有し、画像をボタンの端にプッシュすることです。心に留めておくべきことがあります。
それ以外の場合は、代わりに独自のオーバーライドを作成するのが最善の方法のようですdrawRect:
。これには、この質問の範囲外の他の多くの落とし穴があります。
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];
}
NSButton にカテゴリを追加し、タイトルを中央揃え、左揃えなどにすることができるため、色を希望する色に設定し、既存の属性を保持します。
@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
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;