开发者

NSButton - set text color in disabled mode

开发者 https://www.devze.com 2023-03-13 14:57 出处:网络
For some reason, when my bu开发者_开发百科tton is disabled, the text color turns white. I want it to stay black - how can i do that?You can subclass NSButtonCell and override a method:

For some reason, when my bu开发者_开发百科tton is disabled, the text color turns white. I want it to stay black - how can i do that?


You can subclass NSButtonCell and override a method:

- (NSRect)drawTitle:(NSAttributedString *)title withFrame:(NSRect)frame inView:(NSView *)controlView
{
    if (![self isEnabled]) {
        return [super drawTitle:[self attributedTitle] withFrame:frame inView:controlView];
    }

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

In this way, when button is disabled, the text will have the same color of text when button is enabled.


Also check out this

[btnInfo.cell setImageDimsWhenDisabled:NO];


You can override a private method in NSButtonCell:

- (BOOL)_textDimsWhenDisabled {
    return NO;
}

- (BOOL)_shouldDrawTextWithDisabledAppearance {
    return NO;
}

I filled a radar for a public method: rdar://19218619


Update for swift 4:

  override func drawTitle(_ title: NSAttributedString, withFrame frame: NSRect, in controlView: NSView) -> NSRect {

    if !self.isEnabled {
        return super.drawTitle(self.attributedTitle, withFrame: frame, in: controlView)
    }

    return super.drawTitle(title, withFrame: frame, in: controlView)
    }

This will make text attributes the same as when button is enabled.


In Mojave, any override of draw methods makes it impossible to change the backgroundColor of the NSbutton when highlighted. So I would rather recommend to use

- (BOOL)_shouldDrawTextWithDisabledAppearance

for this purpose. If you are using Swift 4, I would do the following in the Bridging header:

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

And in the subclass of NSButtonCell:

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


You can set text, image, colors, fonts, etc. for different status of a button: normal, highlighted, disabled, etc.

You can do that in Interface Builder by changing the state with the dropdown list.

0

精彩评论

暂无评论...
验证码 换一张
取 消