Загружаются ли окна иначе, чем 10.10 -> 10.11?

#objective-c #macos #cocoa #nswindowcontroller #awakefromnib

#objective-c #macos #cocoa #nswindowcontroller #awakefromnib

Вопрос:

У нас есть окно, которое мы хотим отобразить, и в 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] amp;amp; self.backgroundAlternateColor) ? self.backgroundAlternateColor : self.backgroundColor;

   if ( !self.enabled amp;amp; result ) // if disabled, dim the background
      result = [result colorWithAlphaComponent:self.disabledOpacity];

   return resu<
}
  

Затем в -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];
      }
   }
}
  

Комментарии:

1. Как backgroundColor свойство работает для этих пользовательских кнопок?

2. Добавлен соответствующий код ^^