Swift Utilities — Работа с Динамическими Цветами
![b4b3df641b832cc748a2bb795299cd84.jpg](https://habrastorage.org/getpro/habr/upload_files/b4b/3df/641/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
упрощает управление темами в приложении. Оно обеспечивает более чистый и организованный код, уменьшает вероятность ошибок при ручном переключении тем и способствует более легкой поддержке кода.