Как обойти прозрачные системные цвета при рисовании слоями Core Animation в Mojave? - PullRequest
4 голосов
/ 17 марта 2019

В темном режиме в macOS 10.14 Мохаве большинство системных цветов полупрозрачны.То есть для сопоставления управляющих цветов с фоном окна, который, в свою очередь, слегка окрашен, чтобы соответствовать изображению на рабочем столе.

Теперь при построении представления с перекрывающимися слоями CoreAnimation все портится.Пример:

custom slider control

Это пользовательский слайдер, созданный с помощью CALayers.Вертикальная дорожка представляет собой слой под слоем регулятора.Вот как я устанавливаю цвета:

- (void)updateColors // Called from updateLayer()
{
    self.tickmarkLayer.strokeColor = [NSColor tertiaryLabelColor].CGColor;
    self.tickmarkLayer.lineWidth = 1.0;

    self.trackLayer.backgroundColor = [NSColor controlBackgroundColor].CGColor;
    self.trackLayer.borderColor = [NSColor tertiaryLabelColor].CGColor;
    self.trackLayer.borderWidth = 1.0;

    self.sliderLayer.backgroundColor = [NSColor controlColor].CGColor;
}

Конечно, я не хочу, чтобы ручка была прозрачной, т.е. слой трека не должен просвечивать.Как обойти это, сохранив динамический оттенок?

В идеале, можно получить доступ к «эффективным» системным цветам с текущим оттенком и без прозрачности.Но я не нашел никакого API для этого.

Аналогичная проблема возникает при применении тени к слоям, которые имеют прозрачные (системные) цвета.

Спасибо!

Ответы [ 2 ]

4 голосов
/ 24 марта 2019

Вещи, которые я бы попробовал:

  • используйте два слоя для ползунка: один с цветом фона окна (чтобы придать ему непрозрачный фон), затем слой с той же формой и controlColor сверху.

См. «Обновление пользовательских представлений с использованием установленных методов» в Поддержка темного режима в интерфейсе , чтобы обеспечить динамическое обновление цветов.

  • используйте NSBox вместо слоев, чтобы нарисовать ползунок. Опять же, вам может понадобиться два из них. Но NSBox может автоматически обрабатывать динамические цвета пользовательского интерфейса и тонирование. См. windowBackgroundColor .
4 голосов
/ 21 марта 2019

Может ли NSColor's colorWithAlphaComponent: помочь вам?

https://developer.apple.com/documentation/appkit/nscolor/1526906-colorwithalphacomponent?language=objc

т.е.

self.sliderLayer.backgroundColor = [[NSColor controlColor] colorWithAlphaComponent:1.0f].CGColor;

Похоже, что darkMode устанавливает альфа-компонент цвета элемента управлениядо: 0.247059

...