2

我使用这段代码...

[[textField cell] setBackgroundStyle:NSBackgroundStyleLowered];

...给一段文字一个阴影,它的工作原理。当我尝试用按钮做同样的事情时:

[[refreshButton cell] setBackgroundStyle:NSBackgroundStyleLowered];

代码不起作用。该按钮是一个带有白色透明圆形箭头的瞬时更改按钮。任何想法为什么这不起作用?似乎它会起作用,因为它仍然是一个单元格。

4

1 回答 1

2

NSCell 子类有不同的绘图行为。因此,可设置的背景样式并不意味着该样式实际用于具体子类中。

NSButtonCells在绘制标题之前使用 internalBackgroundStyle 属性此属性不公开设置器,因此您必须继承 NSButtonCell 并相应地在 Interface Builder 中设置单元格类。
要实现降低的背景样式,请在您的子类中覆盖 internalBackgroundStyle:

- (NSBackgroundStyle)interiorBackgroundStyle
{
    return NSBackgroundStyleLowered;
}

如果您需要对绘图进行更多控制,您还可以覆盖 NSButtonCell 的drawInteriorWithFrame:inView:

一种 hacky 方法(不需要子类化)是修改属性标题字符串以达到类似的效果:

NSShadow* shadow = [[NSShadow alloc] init];
[shadow setShadowOffset:NSMakeSize(0,-1)];
[shadow setShadowColor:[NSColor whiteColor]];
[shadow setShadowBlurRadius:0];
NSAttributedString* title = [button.cell attributedTitle];
NSMutableDictionary* attributes = [[title attributesAtIndex:0 longestEffectiveRange:NULL inRange:NSMakeRange(0, title.length)] mutableCopy];
[attributes setObject:shadow forKey:NSShadowAttributeName];
NSAttributedString* string = [[NSAttributedString alloc] initWithString:[button.cell title] attributes:attributes];
[button.cell setAttributedTitle:string];
于 2013-04-03T08:51:58.937 回答