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
Rather than subclass, you can just use NSCell's setBackgroundStyle:
[[aTextField cell] setBackgroundStyle:NSBackgroundStyleRaised];
See this similar question;
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.
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...
精彩评论