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