SwiftUI: получите цвет фона Dynami c (темный или светлый режим) - PullRequest
0 голосов
/ 13 марта 2020

Существует ли способ систематического доступа к стандартному динамическому c цвету фона для представлений SwiftUI, независимо от того, находится ли пользователь в светлом или темном режиме?

Например, я знаю, что может быть следующее используется для получения основного (например, текста) цвета:

let textColor = Color.primary

... но я не вижу ничего похожего для получения цвета фона.

Я ищу что-то, что работает как на iOS, так и на macOS.

1 Ответ

1 голос
/ 13 марта 2020

Таким образом, в настоящее время, похоже, нет такого свойства, встроенного в независимый от ОС класс SwiftUI Color; однако UIColor и NSColor do предоставляют для него средства доступа (для iOS и macOS соответственно), и вы можете использовать эти старые цветовые объекты для инициализации объекта SwiftUI Color.

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

Я также включил ' вторичные '&' третичные 'цвета, которые являются немного субъективными в macOS, но вы всегда можете изменить их на некоторые другие NSColor свойства, если хотите.

Swift v5.2:

import SwiftUI

public extension Color {

    static var background: Color {
        #if os(macOS)
        return Color(NSColor.windowBackgroundColor)
        #else
        return Color(UIColor.systemBackground)
        #endif
    }

    static var secondaryBackground: Color {
        #if os(macOS)
        return Color(NSColor.underPageBackgroundColor)
        #else
        return Color(UIColor.secondarySystemBackground)
        #endif
    }

    static var tertiaryBackground: Color {
        #if os(macOS)
        return Color(NSColor.controlBackgroundColor)
        #else
        return Color(UIColor.tertiarySystemBackground)
        #endif
    }
}

Затем вы просто получаете к ним доступ из любого места в вашем коде, как и любой другой SwiftUI Color. Например:

let backgroundColor = Color.background
...