#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. Добавлен соответствующий код ^^