Ответ
Да, реализовывал поддержку Dark Mode. Ключевой принцип — использование системных цветов и ассетов, которые автоматически адаптируются.
Основные подходы:
-
Системные цвета (UIKit/SwiftUI):
UIColor.systemBackground(фон)UIColor.label(основной текст)UIColor.secondaryLabel(вторичный текст)- В SwiftUI:
Color.primary,.background.
-
Кастомные цвета в Asset Catalog:
- Создание цвета с наборами для
Any AppearanceиDark Appearance. - Обращение через
UIColor(named: "MyColor")илиColor("MyColor").
- Создание цвета с наборами для
-
Принудительная установка темы:
// Для всего окна window?.overrideUserInterfaceStyle = .dark // Для конкретного VC overrideUserInterfaceStyle = .lightГлобальная настройка в
Info.plist(UIUserInterfaceStyle) не рекомендуется, так как лишает пользователя выбора. -
Реакция на смену темы в коде:
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { super.traitCollectionDidChange(previousTraitCollection) if traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) { updateCustomUIForCurrentTheme() } }
Важно: Тестировать контрастность и читаемость в обеих темах, особенно для кастомных элементов.