我想覆盖 NSSearchField 类并让它看起来像
我查看了Apple的Document,发现NSSearchField继承自NSTextField,继承自NSControl,而NSControl本身继承自NSView。
因此,NSTextField 可以对应于 setShadow: 方法,但是,我尝试在 NSSearchField 实例上设置一个 NSShadow,但实际上什么也没发生。
谁能告诉如何获得阴影效果?谢谢~
我想覆盖 NSSearchField 类并让它看起来像
我查看了Apple的Document,发现NSSearchField继承自NSTextField,继承自NSControl,而NSControl本身继承自NSView。
因此,NSTextField 可以对应于 setShadow: 方法,但是,我尝试在 NSSearchField 实例上设置一个 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 没有被挡板并且没有绘制其背景,并且闪烁的光标与其前面的文本一起被遮蔽,否则阴影不会出现。
编辑:
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 按钮有阴影,因此您可以:
这在 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 的位置和颜色,这会导致: 和 ,这似乎最接近您想要的。