Как обрабатывать пользовательские цвета для темного режима в Swift

Вот как я сейчас обращаюсь с UI Element Colors для темного режима с запасным вариантом для старых операционных систем.

extension UIColor {
    class var mySystemBackground: UIColor {
        if #available(iOS 13, *) {
            return .systemBackground
        } else {
            return .white
        }
    }
}

В этом случаеsystemBackground знает, когда он находится в темном режиме, а когда - в светлом, и это изменяется соответственно. Я хотел бы сделать что-то подобное, используя собственные цвета.

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

Вот код, который я думаю ...

extension UIColor{
    class var mySystemYellowColor: UIColor {
        // default light-color 
        var myYellow = UIColor(red: 254/255, green: 219/255, blue: 2/255, alpha: 1.0) /* #fedb02 */

        if #available(iOS 13.0, *) {  

            if traitCollection.userInterfaceStyle == .light {
                return myYellow
            } else {
                // color for dark mode in iOS 13.0
                myYellow = UIColor(red: 242/255, green: 125/255, blue: 0/255, alpha: 1.0) /* #f27d00 */
            }
            return myYellow

        } else {
            return myYellow
        }
    }
}

Является ли это доступным способом обработки пользовательских цветов для темного режима в iOS13 с резервным вариантом для других операционных систем?


person fs_tigre    schedule 21.10.2019    source источник
comment
Если по какой-либо причине вы не можете позволить себе использовать цветные ресурсы, попробуйте новый инициализатор цвета. developer.apple.com/documentation/uikit/uicolor/3238041-init   -  person Desdenova    schedule 21.10.2019


Ответы (3)


Создайте цвета в каталоге активов.

Цвета в каталоге ресурсов могут быть созданы для различных внешнего вида, и к ним можно получить доступ с помощью UIColor(named:) API.

См. Поддержка темного режима в вашем интерфейсе

person vadian    schedule 21.10.2019
comment
Но мне нужно получить доступ к цветам в коде, можно ли получить доступ к активам в коде, например изображениям? Кроме того, будет ли у него запасной вариант для более старых операционных систем? - person fs_tigre; 21.10.2019
comment
Но мне нужно получить доступ к цветам в коде. Почему? Цвета кажутся постоянными. В версиях до iOS 13 в каталоге ресурсов используется только внешний вид освещения. - person vadian; 21.10.2019
comment
1. Да, как он и сказал, используйте UIColor(named:). 2. Нет, это предполагает, что вы нацеливаетесь на iOS 11+. Если вы поддерживаете более ранние версии, используйте новый инициализатор цвета в вашем if #available(iOS 13.0, *) - person Desdenova; 21.10.2019
comment
@ Desdenova - Если вы правильно поняли, что при использовании цветных ресурсов в iOS11 + вам не нужна резервная проверка, верно? - person fs_tigre; 21.10.2019
comment
Мои цвета рассчитываются в коде, они не статичны. - person algrid; 03.06.2021

Да, это использование цветных активов, и для него задан внешний вид: Любой, Темный.

И затем используйте имя актива и UIColor (с именем: «AssetName»), не нужно проверять версию или проверять стиль интерфейса.

person Tornike Davitashvili    schedule 21.10.2019

Я добавил в Assets дополнительный элемент - Color Set и определил 2 цвета - для темной и светлой тем (источник: https://skalolaskovy.ru/xcode/556-ios-dark-theme-support-simple-implementation Русский статья). Вы можете создать столько наборов цветов, сколько вам нужно.

person Max Raskolnikov    schedule 10.01.2021