Macos 如何在NSSearchField上添加阴影
我想覆盖NSSearchField类,使其看起来像 我查看了苹果的文档,发现NSSearchField继承自NSTextField,NSTextField继承自NSControl,而NSControl本身继承自NSView 因此,NSTextField可以对应于setShadow:method,但是,我尝试在NSSearchField实例上设置一个NSShadow,但实际上什么都没有发生 谁能告诉我如何获得阴影效果?谢谢~NSShadow的NSTextField 这导致: 在我使用NSShadows和NSTextFields/NSSearchFields的经验中,阴影不会出现,除非NSTextField没有边框并且没有绘制其背景,并且闪烁的光标与前面的文本一起被阴影遮挡 编辑: 子类NSSearchField,覆盖Macos 如何在NSSearchField上添加阴影,macos,shadow,nssearchfield,Macos,Shadow,Nssearchfield,我想覆盖NSSearchField类,使其看起来像 我查看了苹果的文档,发现NSSearchField继承自NSTextField,NSTextField继承自NSControl,而NSControl本身继承自NSView 因此,NSTextField可以对应于setShadow:method,但是,我尝试在NSSearchField实例上设置一个NSShadow,但实际上什么都没有发生 谁能告诉我如何获得阴影效果?谢谢~NSShadow的NSTextField 这导致: 在我使用NSShad
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 ] ] ;
}