NSButton - Imposta il colore del testo in modalità disabilitata
-
28-10-2019 - |
Domanda
Per qualche motivo, quando il mio pulsante è disabilitato, il colore del testo diventa bianco. Voglio che rimanga nero - come posso farlo?
Soluzione
È possibile impostare testo, immagine, colori, caratteri, ecc. Per lo stato diverso di un pulsante: normale, evidenziato, disabilitato, ecc.
Puoi farlo in Interface Builder modificando lo stato con l'elenco a discesa.
Altri suggerimenti
È possibile sottoclasse NSButtonCell e sovrascrivere un metodo:
- (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 questo modo, quando il pulsante è disabilitato, il testo avrà lo stesso colore del testo quando il pulsante è abilitato.
Dai un'occhiata anche a questo
[btnInfo.cell setImageDimsWhenDisabled:NO];
Puoi sovrascrivere un metodo privato in NSButtonCell:
- (BOOL)_textDimsWhenDisabled {
return NO;
}
- (BOOL)_shouldDrawTextWithDisabledAppearance {
return NO;
}
Ho riempito un radar per un metodo pubblico: rdar: // 19218619
In Mojave, qualsiasi sovraccarico dei metodi di sorteggio rende impossibile cambiare il colore di sfondo di NSButton quando evidenziato. Quindi preferirei consigliare di usare
- (BOOL)_shouldDrawTextWithDisabledAppearance
per questo scopo. Se stai usando Swift 4, farei quanto segue nell'intestazione del ponte:
#import <AppKit/AppKit.h>
@interface NSButtonCell (Private)
- (BOOL)_shouldDrawTextWithDisabledAppearance;
@end
E nella sottoclasse di NSButtonCell:
override func _shouldDrawTextWithDisabledAppearance() -> Bool {
return false
}
Aggiornamento per 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)
}
Ciò renderà gli attributi di testo come quando il pulsante è abilitato.