0

我想覆盖 NSSearchField 类并让它看起来像 在此处输入图像描述

我查看了Apple的Document,发现NSSearchField继承自NSTextField,继承自NSControl,而NSControl本身继承自NSView。

因此,NSTextField 可以对应于 setShadow: 方法,但是,我尝试在 NSSearchField 实例上设置一个 NSShadow,但实际上什么也没发生。

谁能告诉如何获得阴影效果?谢谢~

4

1 回答 1

2

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] ;
}

结果是: 想要层 = YES 想要层 = 否。我假设您不希望放大镜图标或 X 按钮有阴影,因此您可以:

在原来的后面添加第二个 NSSearchField

这在 Interface Builder 中可能更容易做到,但这里的代码可以在 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 的位置和颜色,这会导致: 带对焦环无对焦环,这似乎最接近您想要的。

于 2012-12-27T06:49:35.467 回答