Swift Utilities — Работа с Динамическими Цветами

b4b3df641b832cc748a2bb795299cd84.jpg

За годы работы разработчиком 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 упрощает управление темами в приложении. Оно обеспечивает более чистый и организованный код, уменьшает вероятность ошибок при ручном переключении тем и способствует более легкой поддержке кода.

© Habrahabr.ru