2011-04-16 18 views
22

Mi piacerebbe che gli NSTextFields impostati in Interface Builder avessero ombre. Ho implementato un modo per farlo che sembra funzionare, ma non sono sicuro se sia la strada giusta.NSTextField con ombra?

Quello che ho fatto è sottoclasse NSTextFieldCell come segue e quindi impostare la mia sottoclasse come il tipo di cella del NSTextField in IB. C'è un problema con questo approccio? C'è un modo migliore?

#import "ShadowTextFieldCell.h" 

static NSShadow *kShadow = nil; 

@implementation ShadowTextFieldCell 

+ (void)initialize 
{ 
    kShadow = [[NSShadow alloc] init]; 
    [kShadow setShadowColor:[NSColor colorWithCalibratedWhite:0.f alpha:0.08f]]; 
    [kShadow setShadowBlurRadius:0.f]; 
    [kShadow setShadowOffset:NSMakeSize(0.f, -2.f)]; 
} 

- (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView 
{ 
    [kShadow set]; 
    [super drawInteriorWithFrame:cellFrame inView:controlView]; 
} 

@end 
+1

Questo è esattamente come si suppone di farlo. Il modo più elaborato consiste nel mettere la classe del campo ombra nel proprio bundle con un plug-in IB, quindi IB può effettivamente renderizzare l'ombra durante il layout; ma questo è overkill e i plugin IB sono (temporaneamente?) MIA in xcode 4 comunque. – rgeorge

risposta

8

Non c'è niente di sbagliato in questo approccio. L'altra opzione sarebbe quella di Layer-indietro il vostro campo di testo (chiamata [textField setWantsLayer:YES] e utilizzare CALayer 's proprietà ombra, ma questo è spesso un modo indesiderato di farlo perché il rendering del testo di Core Animation manca subpixel antialiasing.

1

modo più semplice è

[[yourTextField cell] setBackgroundStyle:NSBackgroundStyleRaised]; 

proprio come ha detto zpasternack, ma questo viene utilizzato solo per l'ombreggiatura predefinita, per una sottoclasse personalizzata o per utilizzare il livello ...