Как добавить тень на 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] ;
}

Это приводит к: wantLayer = YESwantLayer = NO, Я предполагаю, что вы не хотите, чтобы значок увеличительного стекла или кнопка 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 ] ] ;
}

Это приводит к: с focusRing а также без фокуса, которые кажутся ближе всего к тому, что вы хотите, если вы можете настроить положение и цвет второго NSSearchField.

Другие вопросы по тегам