Macos 如何在NSSearchField上添加阴影

Macos 如何在NSSearchField上添加阴影,macos,shadow,nssearchfield,Macos,Shadow,Nssearchfield,我想覆盖NSSearchField类,使其看起来像 我查看了苹果的文档,发现NSSearchField继承自NSTextField,NSTextField继承自NSControl,而NSControl本身继承自NSView 因此,NSTextField可以对应于setShadow:method,但是,我尝试在NSSearchField实例上设置一个NSShadow,但实际上什么都没有发生 谁能告诉我如何获得阴影效果?谢谢~NSShadow的NSTextField 这导致: 在我使用NSShad

我想覆盖NSSearchField类,使其看起来像

我查看了苹果的文档,发现NSSearchField继承自NSTextField,NSTextField继承自NSControl,而NSControl本身继承自NSView

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

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

NSShadow的NSTextField 这导致:

在我使用NSShadows和NSTextFields/NSSearchFields的经验中,阴影不会出现,除非NSTextField没有边框并且没有绘制其背景,并且闪烁的光标与前面的文本一起被阴影遮挡

编辑:

子类NSSearchField,覆盖
drawRect:
结果是:。 我假设您不希望放大镜图标或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的位置和颜色,那么结果就是:和你想要的最接近。

你能说出一个Mac应用程序的名字吗?您的屏幕截图很有帮助,但一个交互式示例搜索字段将更有帮助。恐怕我已经找到了一个带有自定义NSSearchField的应用程序。我的目标是找到一种方法,在NSSearchField的上半部分设置灰色阴影,而在下半部分设置白色阴影。不一定要模仿屏幕截图所显示的内容,但是请告诉我怎么做,谢谢。对不起,我的英语很差,希望你能理解。这个问题存在于一些遗留问题中。。。文本字段是旧的,基于样式绘制,不考虑阴影。。。您可以对单元格进行子类化,并以您喜欢的任何方式绘制它。。。但这可能有点过分了。。。最简单的方法可能是使用一个没有边框的文本单元格,以及一个您希望单元格外观的图像。我曾尝试覆盖NSSearchFieldCell,但问题是,如果我不调用super draw方法,则不会绘制放大镜。我曾尝试将NSSearchField的bezeled和drawsBackground设置为NO,但它只会给放大镜和我输入的文本以及光标添加阴影。我的目标是在nsSearchField的边界设置阴影,谢谢,这对我有帮助。此外,解决方案有点棘手,它的工作!
- (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] ;
}
- (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 ] ] ;
}