NSButton禁用标题颜色始终为灰色

时间:2014-11-11 11:09:53

标签: macos cocoa nsbutton

我有一个自定义的NSButton,但无论我做什么,禁用的颜色总是灰色

我尝试了所遇到的所有解决方案

  • 我用白色前景色设置属性字符串标题(我看起来像禁用状态的颜色属性被忽略)

  • 我确实设置了[[self cell] setImageDimsWhenDisabled:NO];

文件记录时的事件

// When disabled, the image and text of an NSButtonCell are normally dimmed with gray.
// Radio buttons and switches use (imageDimsWhenDisabled == NO) so only their text is dimmed.
@property BOOL imageDimsWhenDisabled;

它不起作用

我的NSButton使用了wantUpdateLayer YES,因此绘制方法被覆盖,但我不明白,标题是在哪里绘制的

2 个答案:

答案 0 :(得分:3)

在OS X 10.9上,我通过对绘制按钮的单元格进行子类化,设法改变按钮文本的颜色。

在Xcode中创建一个新的NSButtonCell子类并覆盖以下方法:

- (NSRect)drawTitle:(NSAttributedString *)title
      withFrame:(NSRect)frame
         inView:(NSView *)controlView {

    NSDictionary *attributes = [title attributesAtIndex:0 effectiveRange:nil];

    NSColor *systemDisabled = [NSColor colorWithCatalogName:@"System" 
                                                  colorName:@"disabledControlTextColor"];
    NSColor *buttonTextColor = attributes[NSForegroundColorAttributeName];

    if (systemDisabled == buttonTextColor) {
        NSMutableDictionary *newAttrs = [attributes mutableCopy];
        newAttrs[NSForegroundColorAttributeName] = [NSColor orangeColor];
        title = [[NSAttributedString alloc] initWithString:title.string
                                            attributes:newAttrs];
    }

     return [super drawTitle:title
              withFrame:frame
                 inView:controlView];

}

选择Xcode中的按钮,然后选择其单元格(可能最容易在Interface Builder底座中执行此操作),现在转到 Identity Inspector 并将单元格的类设置为子类的类。

答案 1 :(得分:0)

这是因为默认值为true

- (BOOL)_shouldDrawTextWithDisabledAppearance

尝试更改此方法,而不要更改imageDimsWhenDisabled。如果您使用的是Swift 4,我将在Bridging标头中执行以下操作:

#import <AppKit/AppKit.h>
@interface NSButtonCell (Private)
- (BOOL)_shouldDrawTextWithDisabledAppearance;
@end

在NSButtonCell的子类中:

override func _shouldDrawTextWithDisabledAppearance() -> Bool {
    return false
}

就是这样:灰色应该消失