Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NSTextField with shadow?

I'd like the NSTextFields I set up in Interface Builder to have shadows. I've implemented a way to do this which seems to work, but I'm not sure if it's the right way.

What I did is subclass NSTextFieldCell as follows and then set my subclass as the NSTextField's cell's type in IB. Is there a problem with this approach? Is there a better way?

#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
like image 852
sam Avatar asked Apr 16 '11 18:04

sam


3 Answers

Rather than subclass, you can just use NSCell's setBackgroundStyle:

[[aTextField cell] setBackgroundStyle:NSBackgroundStyleRaised];

See this similar question;

like image 197
zpasternack Avatar answered Nov 17 '22 21:11

zpasternack


There's nothing wrong with this approach. The other option would be to layer-back your text field (call [textField setWantsLayer:YES] and use CALayer's shadow properties, but this is often an undesirable way to do it because Core Animation's text rendering lacks subpixel antialiasing.

like image 38
indragie Avatar answered Nov 17 '22 21:11

indragie


Easiest way is

[[yourTextField cell] setBackgroundStyle:NSBackgroundStyleRaised]; 

just like zpasternack said, but this is used only for default shadow-ing, for custom one subclass or use the layer...

like image 1
Catalin Avatar answered Nov 17 '22 21:11

Catalin