Как добавить тень на NSSearchField
Я хочу переписать класс NSSearchField и сделать его похожим на
Я изучил документ Apple и обнаружил, что NSSearchField наследуется от NSTextField, который наследуется от NSControl, а сам NSControl наследуется от NSView.
Итак, NSTextField может соответствовать setShadow: method, однако я попытался установить NSShadow для экземпляра NSSearchField, но на самом деле ничего не произошло.
Может кто-нибудь сказать, как получить эффект тени? Благодаря ~
1 ответ
NSTextField с NSShadow
// Modify theTextField so that its NSShadow will be visible.
theTextField.wantsLayer = YES ;
theTextField.bezeled = NO ;
theTextField.drawsBackground = NO ;
NSShadow* redShadow = [NSShadow new] ;
redShadow.shadowOffset = NSMakeSize(2, 2) ;
redShadow.shadowColor = [NSColor redColor] ;
theTextField.shadow = redShadow ;
Это приводит к:
По моему опыту с NSShadows и NSTextFields/NSSearchFields тень не появляется, если только NSTextField не обведен рамкой и не рисует его фон, а мигающий курсор затеняется вместе с текстом перед ним.
Редактировать:
Подкласс NSSearchField, переопределить drawRect:
- (void) drawRect:(NSRect)dirtyRect {
NSShadow* redShadow = [NSShadow new] ;
redShadow.shadowOffset = NSMakeSize(2, -2) ;
redShadow.shadowColor = [NSColor redColor] ;
[NSGraphicsContext saveGraphicsState] ;
self.wantsLayer = YES ; // or NO
[redShadow set] ;
[super drawRect:dirtyRect] ;
[NSGraphicsContext restoreGraphicsState] ;
}
Это приводит к: , Я предполагаю, что вы не хотите, чтобы значок увеличительного стекла или кнопка X имели тени, поэтому вы можете:
Добавьте второй NSSearchField за оригиналом
Это, вероятно, было бы легче сделать в Интерфейсном Разработчике, но вот код, который достиг бы этого в подклассе NSSearchField.
- (void) awakeFromNib {
[super awakeFromNib] ;
NSSearchField* shadowSearchField = [NSSearchField new] ;
[self.superview addSubview:shadowSearchField positioned:NSWindowBelow relativeTo:self ] ;
shadowSearchField.translatesAutoresizingMaskIntoConstraints = NO ;
shadowSearchField.editable = NO ;
float horizontalOffset = -2 ;
float verticalOffset = -2 ;
[self.superview addConstraint: [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:shadowSearchField attribute:NSLayoutAttributeLeading multiplier:1 constant:horizontalOffset ] ] ;
[self.superview addConstraint: [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:shadowSearchField attribute:NSLayoutAttributeTop multiplier:1 constant:verticalOffset ] ] ;
[self.superview addConstraint: [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:shadowSearchField attribute:NSLayoutAttributeWidth multiplier:1 constant:0 ] ] ;
[self.superview addConstraint: [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:shadowSearchField attribute:NSLayoutAttributeHeight multiplier:1 constant:0 ] ] ;
}
Это приводит к: а также
, которые кажутся ближе всего к тому, что вы хотите, если вы можете настроить положение и цвет второго NSSearchField.