10

For some reason, when my button is disabled, the text color turns white. I want it to stay black - how can i do that?

Erik Sapir
  • 23,209
  • 28
  • 81
  • 141
  • you probably already tried button.textcolor =[UIColor blackColor]; but just in case – Radu Jun 16 '11 at 12:01

6 Answers6

27

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.

cescobaz
  • 366
  • 3
  • 8
7

Also check out this

[btnInfo.cell setImageDimsWhenDisabled:NO];
Sangram Shivankar
  • 3,535
  • 3
  • 26
  • 38
Catalin
  • 1,821
  • 4
  • 26
  • 32
2

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

Stephan Michels
  • 952
  • 4
  • 18
1

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.

Joey Slomowitz
  • 179
  • 1
  • 12
1

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
}
Ricardo Anjos
  • 1,417
  • 18
  • 22
-6

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.

Christian Beer
  • 2,027
  • 15
  • 13