Пользовательский цвет фона NSView не меняется при включении и выключении темного режима - PullRequest
0 голосов
/ 10 июня 2019

Я не могу понять, как обновить цвет фона моего собственного NSView, когда пользователь включается и выходит из темного режима.

Я прочитал документацию и следовал инструкциям здесь: обнаружение темного режима

Странно то, что я могу заставить все подпредставления вести себя правильно, но по какой-то странной причине не могу изменить цвет фона основного вида.Цвет фона представления выглядит правильно, когда я запускаю приложение в любом из режимов, но когда я переключаюсь между режимами во время работы приложения, оно не обновляется до новой темы.

Буду признателен за любые предложения.

Внутри пользовательского NSView у меня есть метод

- (void) viewDidChangeEffectiveAppearance
{
    self.needsDisplay = YES;
}

, а внутри drawRect у меня есть простая смена цвета перед продолжением рисования в представлении

NSAppearance *currentAppearance = [NSAppearance  currentAppearance];
if (@available(*, macOS 10.14)) {
    if(currentAppearance.name == NSAppearanceNameDarkAqua) {
        red  = 0.5*red+0.5;
        green = 0.5*green+0.5;
        blue  = 0.5*blue+0.5;
    }
}

Вот скриншот темного режима до (как он должен выглядеть)

Темный режим до

Вот скриншот светлого режима после переключения пользователя

Режим освещения после

Вот скриншот режима освещения до (как это должно выглядеть)

Режим освещения до

А вот скриншот darkmode после переключения пользователя

Dark Mode After

ps. Причина, по которой я сбит с толку и имею небольшой код для публикации, заключается в том, чтоправильное поведение должно происходить автоматически с ливсе усилия.Я даже удалил представление из пера и восстановил его, думая, что, возможно, некоторые настройки были повреждены, но это не решило проблему.

Обновление: я нашел источник проблемы.Этот метод вызывается в windowDidLoad

- (void) setTransparent:(BOOL)transparent
    {
        if(transparent) {
            [self.window setOpaque:NO];
            NSColor *backgroundColor = [NSColor windowBackgroundColor];
            backgroundColor = [backgroundColor colorWithAlphaComponent: .75];
            [self.window setBackgroundColor:backgroundColor];
            self.window.alphaValue = 0.75;
    }
    else {
            [self.window setOpaque:YES];
            NSColor *backgroundColor = [NSColor windowBackgroundColor];
            backgroundColor = [backgroundColor colorWithAlphaComponent: 1];
            [self.window setBackgroundColor:backgroundColor];
            self.window.alphaValue = 1;
        }
    }

Я получаю ожидаемое поведение, если закомментирую вызов этого метода.

Почему это привело к потере автоматического поведения при изменении цвета фонакогда пользователь переключается между светлым и темным режимом?

1 Ответ

1 голос
/ 21 июня 2019

Я предполагаю, что вы на самом деле не используете стандартный цвет для цвета фона.

Вы используете [NSColor windowBackgroundColor], но затем делаете копию с другим альфа-компонентом (через colorWithAlphaComponent),делая его больше не стандартным цветом.

Я полагаю, что автоматическое поведение "просто работает" происходит, когда вы используете стандартные определения цвета.В качестве теста, не могли бы вы попытаться удалить вызовы colorWithAlphaComponent (где вы добавляете прозрачность) из вашего метода tranransparent и посмотреть, работает ли он?если это произойдет, вам может понадобиться найти другой способ добавить прозрачность вашему представлению, если вы хотите автоматическое поведение.

...