Реализация высококонтрастного режима в мобильном приложении
Высококонтрастный режим — не то же самое, что тёмная тема. Это режим для пользователей со слабым зрением, где контрастность текста и элементов управления повышается принудительно: белый фон → чисто белый, серый текст → чёрный, подсказки и декоративные элементы скрываются, границы становятся чётче.
На iOS — Settings → Accessibility → Display & Text Size → Increase Contrast. На Android — Settings → Accessibility → High Contrast Text (только текст) или High Contrast Mode (Samsung One UI).
Как реагировать на системный запрос
iOS
UIAccessibility.isDarkerSystemColorsEnabled — проверяет включённый Increase Contrast. Меняется в реальном времени; подписываемся на UIAccessibility.darkerSystemColorsStatusDidChangeNotification.
Система автоматически адаптирует системные цвета (UIColor.label, UIColor.secondaryLabel) к High Contrast. Кастомные цвета из Asset Catalog поддерживают High Contrast вариант: в .xcassets для каждого цвета есть Appearances → High Contrast. Добавляем HC-вариант — и цвет автоматически переключается без кода.
Для SwiftUI: @Environment(\.colorSchemeContrast) — возвращает .standard или .increased. Используем для условного выбора цвета или веса шрифта:
@Environment(\.colorSchemeContrast) var contrast
var textColor: Color {
contrast == .increased ? .black : .secondary
}
Android
Configuration.HIGHTEXT_ADJUSTMENT_UNSET vs заданное значение — не работает как флаг High Contrast системно (в отличие от iOS). На Android «High Contrast Text» — это системный override, который Android применяет поверх приложения: текст автоматически рисуется с обводкой (text outline) для повышения читаемости на любом фоне. Это нельзя контролировать из приложения, но можно проверить через AccessibilityManager.isHighTextContrastEnabled() (API 26+):
val am = getSystemService(AccessibilityManager::class.java)
val isHighContrast = am?.isHighTextContrastEnabled ?: false
Samsung One UI предоставляет полноценный High Contrast Mode — там меняются системные цвета. В Jetpack Compose isSystemInDarkTheme() не поймает HC на Samsung; нужна проверка через AccessibilityManager.
Flutter
MediaQuery.of(context).highContrast — true при включённом HC (iOS и Android). В ThemeData можно задать отдельную ColorScheme для HC:
ThemeData theme = MediaQuery.of(context).highContrast
? ThemeData(colorScheme: highContrastColorScheme)
: ThemeData(colorScheme: defaultColorScheme);
Что нужно адаптировать
Цвет текста на фоне. WCAG 2.1 требует контрастность 4.5:1 для обычного текста и 3:1 для крупного (18pt+). В HC-режиме целевой порог — 7:1. Инструмент проверки: Color Contrast Analyser (desktop) или Xcode Accessibility Inspector.
Тонкие границы и разделители. 1px линии на белом фоне исчезают при HC. Нужно увеличить толщину или изменить цвет.
Градиенты и изображения как фон под текст. В HC текст поверх градиента теряет читаемость. Добавляем текстовую подложку или убираем градиент в HC-режиме.
Тени и blur-эффекты. Frosted glass, UIVisualEffectView, BackdropFilter в Flutter — в HC не контрастны. Заменяем на сплошной непрозрачный фон.
Декоративные иконки. В HC убираем иконки-украшения, оставляем только функциональные с достаточным контрастом.
Срок: 1-3 дня. Зависит от количества кастомных компонентов и от того, реализована ли тёмная тема — она часто становится основой для HC. Стоимость рассчитывается индивидуально.







