1

我们有一个要显示的窗口,在 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];
      }
   }
}
4

0 回答 0