Обнаружить темный/светлый вид системы 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")
Обратите внимание, что этот вопрос предназначен для:
-
macOS
вApp
Scene
уровень, который можно использовать с автономнымMenuBarExtra
полезность. - не использует неприменимый подход, например
View
уровневое решение, которое можно найти в других вопросах StackOverflow… и которое не работает с текущей версией Xcode 14.3. - может использовать изображения, предоставленные разработчиком, т.е. не изображения, предоставленные системой. Хотя, возможно, в системных образах есть что-то, что можно воспроизвести в образах разработчика??