我们有一个要显示的窗口,在 10.11 中,它按我们预期的方式显示。
我们在 中设置窗口内视图的所有属性-windowDidLoad
,当窗口显示时,这些按钮具有正确的颜色:
- (void)windowDidLoad
{
[super windowDidLoad];
LightTheme *lightTheme = [[LightTheme alloc] init];
_cancelButton.backgroundColor = lightTheme.controlColor;
_stopButton.backgroundColor = lightTheme.controlColor;
_cancelButton.textColor = lightTheme.textColor;
_stopButton.textColor = lightTheme.textColor;
}
但是,在 10.10 中使用相同的代码,颜色被设置为此按钮子类的默认值
有趣的是,如果您与按钮交互,它们会立即重绘并具有正确的白色背景
但是,如果我们将代码移动到 -awakeFromNib,它在两个操作系统上看起来都不错,只要显示窗口
- (void)awakeFromNib
{
[super awakeFromNib];
LightTheme *lightTheme = [[LightTheme alloc] init];
_cancelButton.backgroundColor = lightTheme.controlColor;
_stopButton.backgroundColor = lightTheme.controlColor;
_cancelButton.textColor = lightTheme.textColor;
_stopButton.textColor = lightTheme.textColor;
}
当窗口从 10.10->10.11 显示时,它们是否发生了变化?还是我们错过了其他东西?
以前好像是这样的:
-awakeFromNib -> 显示窗口
现在看起来像:
-windowDidLoad -> 显示窗口
编辑:这是该backgroundColor
属性的使用方式:
首先,根据按钮状态获取颜色
-(NSColor*)effectiveBackgroundColor
{
NSColor *result = ([self isOn] && self.backgroundAlternateColor) ? self.backgroundAlternateColor : self.backgroundColor;
if ( !self.enabled && result ) // if disabled, dim the background
result = [result colorWithAlphaComponent:self.disabledOpacity];
return result;
}
然后在 中-drawRect
,调用这个方法:
-(void)drawBackground
{
NSSize inset = [self buttonInset];
NSRect bodyRect = self.bounds;
bodyRect = NSInsetRect(bodyRect, inset.width, inset.height);
NSBezierPath* buttonPath = [NSBezierPath bezierPathWithRoundedRect:bodyRect xRadius:self.cornerRadius yRadius:self.cornerRadius];
NSColor* effectiveBackgroundColor = [self effectiveBackgroundColor];
if (effectiveBackgroundColor)
{
[NSGraphicsContext saveGraphicsState];
[[self effectiveBackgroundShadow] set];
[effectiveBackgroundColor setFill];
[buttonPath fill];
[NSGraphicsContext restoreGraphicsState];
if( [[self cell] isHighlighted] )
{
[[[NSColor blackColor] colorWithAlphaComponent:self.highlightOpacity] setFill];
[buttonPath fill];
}
}
}