2011-04-16 10 views
22

Me gustaría que los NSTextFields que configuré en Interface Builder tengan sombras. Implementé una forma de hacer esto que parece funcionar, pero no estoy seguro de si es la correcta.NSTextField con sombra?

Lo que hice fue la subclase NSTextFieldCell de la siguiente manera y luego establecí mi subclase como el tipo de celda de NSTextField en IB. ¿Hay algún problema con este enfoque? ¿Hay una mejor manera?

#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

Así es exactamente como se supone que debes hacerlo. La forma más elegante es poner su clase de campo de sombra en su propio paquete con un complemento de IB, y luego IB puede renderizar la sombra durante el diseño; pero eso es demasiado exagerado y los complementos de IB son (¿temporalmente?) MIA en xcode 4 de todos modos. – rgeorge

Respuesta

8

No hay nada de malo en este enfoque. La otra opción sería la de la capa de devolución de su campo de texto (llamada [textField setWantsLayer:YES] y utilizar CALayer 's propiedades de sombra, pero esto es a menudo una manera no deseable hacerlo porque la representación de texto de Core Animation carece de suavizado de subpíxeles.

1

la manera más fácil es

[[yourTextField cell] setBackgroundStyle:NSBackgroundStyleRaised]; 

como dijo zpasternack, pero esto se usa solo para sombreado predeterminado, para una subclase personalizada o para usar la capa ...