NSTextField с тенью? - PullRequest
       53

NSTextField с тенью?

22 голосов
/ 16 апреля 2011

Мне бы хотелось, чтобы в NSTextFields, которые я настроил в Интерфейсном Разработчике, были тени. Я реализовал способ сделать это, который, кажется, работает, но я не уверен, что это правильный путь.

То, что я сделал, это подкласс NSTextFieldCell следующим образом, а затем установил мой подкласс как тип ячейки NSTextField в IB. Есть ли проблема с этим подходом? Есть ли лучший способ?

#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

Ответы [ 3 ]

10 голосов
/ 14 сентября 2011

Вместо подкласса вы можете просто использовать NSCell setBackgroundStyle:

[[aTextField cell] setBackgroundStyle:NSBackgroundStyleRaised];

См. этот похожий вопрос ;

8 голосов
/ 15 июля 2011

В этом подходе нет ничего плохого.Другой вариант заключается в том, чтобы отодвинуть назад текстовое поле (вызвать [textField setWantsLayer:YES] и использовать свойства теней CALayer ), но это часто нежелательный способ сделать это, потому что при рендеринге текста в Core Animation отсутствует субпиксельное сглаживание.

1 голос
/ 18 мая 2013

Самый простой способ -

[[yourTextField cell] setBackgroundStyle:NSBackgroundStyleRaised]; 

точно так же, как сказал zpasternack, но это используется только для теневого копирования по умолчанию, для пользовательского подкласса или для использования слоя ...

...