Обнаружить темный/светлый вид системы macOS на уровне приложения/сцены SwiftUI (для использования с MenuBarExtra)?

Как определить, если возможно, темный/светлый вид системы macOS на уровне приложения/сцены SwiftUI? Этот конкретный случай предназначен для использования с .

В целом можно ожидать, что будет работать следующее:

      @main
struct ModeCheckApp: App {    
    var body: some Scene {
        @Environment(\.colorScheme) var colorScheme: ColorScheme

        MenuBarExtra {
            Text(colorScheme == .dark ? "Dark" : "Light")
            Button("Print ColorScheme") { 
                print("colorScheme is '\(colorScheme)'")
            }
        } label: { 
            Image(colorScheme == .light ? "ImageA" : "ImageB")
        }
    }
}

Вышеупомянутый подход работает, но никогда не обновляется:

Предупреждение во время выполнения: «Доступ к значению среды вне установки в представлении. Оно всегда будет считывать значение по умолчанию и не будет обновляться».

С другой стороны, можно было бы ожидать, что образ xcasset будет содержать всеAny, Light, Darkизображения для автоматического выбора. Однако данный подход обеспечивает лишьLightИзображение внешнего вида — то же, что и предыдущий подход.

                  Image("ImageC")

Каким-то образомsystemName:изображение автоматически изменится в соответствии с настройками внешнего вида macOS:

                  Image(systemName: "questionmark")

Обратите внимание, что этот вопрос предназначен для:

  1. macOSвApp Sceneуровень, который можно использовать с автономнымMenuBarExtraполезность.
  2. не использует неприменимый подход, напримерViewуровневое решение, которое можно найти в других вопросах StackOverflow… и которое не работает с текущей версией Xcode 14.3.
  3. может использовать изображения, предоставленные разработчиком, т.е. не изображения, предоставленные системой. Хотя, возможно, в системных образах есть что-то, что можно воспроизвести в образах разработчика??

0 ответов

Другие вопросы по тегам