За годы работы разработчиком iOS, я собрал множество инструментов и полезных штук, которые облегчают процесс разработки. В этой статье, я хочу поделиться одним из таких инструментов. Это будет не большая статья. Я покажу, как пользоваться этой утилитой, продемонстрирую её в действии. Надеюсь, что статья окажется полезной для вас.

При разработке приложений, одним из ключевых аспектов является адаптивность интерфейса к различным режимам отображения, особенно к светлой и тёмной теме. Я покажу подход к управлению цветами интерфейса с использованием свойства-обёртки DynamicUIColor

DynamicUIColor

DynamicUIColor — это свойство-обёртка (@propertyWrapper), которое позволяет легко настроить цвета для светлой и тёмной темы интерфейса. В основе работы лежит изменение цветов в зависимости от текущего стиля интерфейса пользователя, который может быть светлым, тёмным или неопределённым.

#if canImport(UIKit)

import UIKit

///Example:
///
///```swift
///
/// @DynamicUIColor(
///     light: UIColor(red: 0, green: 0, blue: 0, alpha: 1),
///     dark: UIColor(red: 1, green: 1, blue: 1, alpha: 1)
/// ) var title: UIColor
///
/// @DynamicUIColor var subtitle = UIColor(red: 0, green: 0, blue: 0, alpha: 1)
///```
@propertyWrapper
public struct DynamicUIColor {
  
    let light: UIColor
    let dark: UIColor

    public var wrappedValue: UIColor {
        UIColor { traitCollection -> UIColor in
            switch traitCollection.userInterfaceStyle {
            case .dark:
                return self.dark

            case .light, .unspecified:
                return self.light

            @unknown default:
                return self.light
            }
        }
    }

    public init(light: UIColor, dark: UIColor? = nil) {
        self.light = light
        self.dark = dark ?? light
    }

    public init(wrappedValue: UIColor) {
        self.light = wrappedValue
        self.dark = wrappedValue
    }
}

#endif

Пример использования:

@DynamicUIColor(
    light: UIColor(red: 0, green: 0, blue: 0, alpha: 1),
    dark: UIColor(red: 1, green: 1, blue: 1, alpha: 1)
) var titleColor: UIColor
@DynamicUIColor var subtitleColor = UIColor(red: 0, green: 0, blue: 0, alpha: 1)

В этих примерах titleColor будет черным в светлой теме и белым в тёмной, а subtitleColor будет черным в обеих темах.

Преимущества и Применение

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

Еще статьи Swift Utilities:

Комментарии (5)


  1. LeshaRB
    19.11.2023 08:49
    +1

    А одной статьей почему б не оформить?
    Просто три маленькие...


    1. VAnsimov Автор
      19.11.2023 08:49
      -1

      материала на очень много статей, буду постепенно выкладывать


  1. debug45
    19.11.2023 08:49

    Зачем такие сложности, если можно задать цвета просто через XCAssets сразу парами для светлой и тёмной тем, и дальше всё будет само динамически переключаться?


    1. VAnsimov Автор
      19.11.2023 08:49

      Не все такое любят и мой опыт показывает, так мало кто делает, цвета кодом пишут, но это мой опыт


      1. debug45
        19.11.2023 08:49

        С появлением автогенерируемых силами Xcode 15 констант ColorResource и им подобных, смысла описывать цвета в коде вообще не осталось, кажется