Перейти к содержимому

Инструменты разработчика2 мин чтения

Цвета в Xcode: тёмная тема, высокий контраст и сгенерированные символы

Называйте цвета по роли, храните тёмный и контрастный варианты в одном наборе, пользуйтесь символами, которые генерирует Xcode, и проверяйте контраст цифрами — плюс серый, который провалил наши собственные тесты доступности.

Цвета кажутся самой простой частью приложения — пока не добавишь тёмную тему, вторую платформу и дизайнера, который в третий раз переименовывает «синий». Немного порядка в каталоге ресурсов избавляет от россыпи hex-кодов по всему проекту.

Называйте цвета по роли, а не по значению

Цвет blue500 говорит, как он выглядит; цвет textSecondary или statusSuccess — для чего он нужен. Имена по роли переживают редизайн: когда фирменный синий меняется, вы правите один набор цветов, и за ним следуют все экраны. Начните с небольшого набора — фон, приподнятая поверхность, основной и второстепенный текст, акцент, успех, предупреждение, ошибка — и добавляйте новые, только когда появится реальная потребность.

Один набор цветов — несколько вариантов

Color Set в каталоге ресурсов может хранить разные значения для разных условий:

  • варианты Any и Dark, чтобы система сама переключала цвет вместе с тёмной темой;
  • варианты High Contrast для тех, кто включает «Увеличение контраста» в настройках универсального доступа;
  • цветовое пространство для каждого значения — sRGB для большинства цветов, Display P3, когда нужны более насыщенные оттенки на современных экранах.

Прежде чем заводить свои цвета, посмотрите на системные: label, secondaryLabel, systemBackground и другие уже подстраиваются под тёмную тему и настройки контраста.

Используйте сгенерированные символы

Начиная с Xcode 15, для каждого цвета и изображения в каталоге ресурсов генерируется Swift-символ. Больше никаких строковых имён, которые тихо ломаются после переименования:

swift
// SwiftUI: Xcode генерирует .statusSuccess и .surfaceElevated из каталога ресурсов
Text("Connected")
    .foregroundStyle(Color(.statusSuccess))
    .padding()
    .background(Color(.surfaceElevated))

// UIKit использует те же сгенерированные ресурсы
let tint = UIColor(resource: .brandAccent)

Если цвет переименуют или удалят, сборка упадёт — вместо того чтобы приложение тихо ничего не показало.

Проверяйте контраст цифрами

Читаемому тексту нужен контраст не ниже 4,5:1 относительно фона, а крупному — 3:1 (WCAG AA). На глаз этого не оценить. Работая над собственной консолью, мы выбрали для второстепенного текста на карточке #111111 тёплый серый #6F6B63. На наших экранах он смотрелся отлично, но измеренный контраст оказался всего 3,56:1, и автоматические тесты доступности его отклонили. Замена на #A39F95 подняла контраст примерно до 5,6:1 без изменения характера дизайна.

ПроверкаЦель
Основной текст и фон4,5:1 или выше
Крупный текст (примерно от 18 pt)3:1 или выше
Тёмная темаИзмерьте заново — тёмные варианты ломаются в других местах
High ContrastВарианты для ключевого текста и элементов управления

Единые палитры во всех приложениях

Когда одна студия выпускает много приложений, единообразие становится отдельной задачей: каждый проект начинается с того, что кто-то вручную подбирает цвета. Для этого момента мы и сделали ColorsGen. Он строит гармоничную палитру от выбранного базового цвета — или генерирует её случайно — и готовит для Xcode в пару касаний на iPhone, iPad и Mac. Про иконки и графические ресурсы — наше руководство по размерам иконок в 2026 году.

Совет

Добавьте проверку контраста в UI-тесты или дизайн-ревью. Это самая дешёвая доработка доступности — и она ловит проблемы раньше пользователей.

ПоделитьсяXLinkedIn

ONLYAPPS team

Нови-Сад, Сербия · onlyapps.org

Контакты

Аналитические cookie мы используем только с вашего согласия. Необходимые cookie обеспечивают работу сайта. Политика конфиденциальности