Обновление для темного режима: NSColor игнорирует изменения внешнего вида? - PullRequest
0 голосов
/ 25 сентября 2018

В моем веб-представлении я использую переменные CSS для изменения различных цветов во время выполнения в зависимости от того, включен ли темный режим в MacOS 10.14.Это очень хорошо работает.Сложная задача - обновлять цвета при изменении внешнего вида системы.

Я обнаруживаю изменение, наблюдая за свойством effectiveAppearance в окне.Это уведомление приходит, как и ожидалось, но когда я обновляю цвета, NSColor по-прежнему дает мне темные цвета (или режим, в котором приложение запускалось).Например, NSColor.textColor по-прежнему белый, а не черный, когда я реагирую на переключение из темного режима в светлый.Похоже, то же самое происходит с моими собственными цветовыми активами.

Есть ли другой способ или время, когда я должен получить эти цвета?Или это может быть ошибка ОС?

Редактировать: Я также попытался создать подкласс WebView и обновить мои цвета в drawRect(), если имя эффективного внешнего вида веб-представления изменяется,В первый раз я получаю все светлые цвета, даже когда приложение запускается в темном режиме.После этого, когда я переключаюсь из светлого режима в темный, я получаю темные версии системных цветов и светлые версии цветов каталога ресурсов.

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

1 Ответ

0 голосов
/ 26 сентября 2018

Изменение внешнего вида системы не меняет текущий внешний вид, , который можно запрашивать и устанавливать, и не зависит от внешнего вида системы .Но внешний вид на самом деле зависит от «владеющего» представления, как в пределах одной иерархии представлений, так как может появиться несколько появлений благодаря динамичности, а также ручной настройке свойства appearance для представления.

Какао уже обновлениятекущее появление в некоторых ситуациях, например, drawRect:, updateLayer, layout и updateConstraints.В другом месте вы должны сделать это так:

NSAppearance * saved = [NSAppearance currentAppearance];
[NSAppearance setCurrentAppearance:someView.effectiveAppearance];

// Do your appearance-dependent work, like querying the CGColor from
// a dynamic NSColor or getting its RGB values.

[NSAppearance setCurrentAppearance:saved];
...