Перейти к основному содержимому
Версия: 5.8.2

Дизайн-система

Для настройки пользовательского интерфейса в SDK используется дизайн-система на основе класса ChatTheme. С её помощью можно настроить внешний вид чата под корпоративный стиль вашего приложения.

SDK поддерживает светлую и тёмную темы — они задаются через свойства theme и darkTheme на экземпляре ChatCenterUISDK. Если тёмная тема не задана, используются значения из светлой.

к сведению

Визуальное представление дизайн-системы доступно в виде UIKit в Figma.

Файл содержит следующие страницы:

  • Foundation — цвета, типографика, иконки (светлая и тёмная темы)
  • Message Type — все типы сообщений в контексте чата
  • Components — Navigation, Status, Button, Bubbles, Input Field, OS UI, Content, Illustration
  • User Flow — 40+ экранов с полным пользовательским сценарием
подсказка

Начните с Быстрого старта — готовый пример, который можно скопировать и адаптировать.

Не знакомы с терминами «токен», «компонент», «flow»? Смотрите Глоссарий.

Быстрый пример

// Создание темы с кастомными цветами
let colors = ChatColors()
colors.main = .black
colors.link = .systemBlue

let theme = ChatTheme(colors: colors)

// Применение
chatCenterSDK.theme = theme
chatCenterSDK.darkTheme = darkTheme // опционально

ChatTheme можно создать двумя способами:

// Из базовых токенов (цвета, шрифты, изображения)
ChatTheme(colors: ChatColors(), images: ChatImages(), typography: ChatTypography())

// Из настроенных компонентов (для более детальной кастомизации)
ChatTheme(components: myComponents)

Что и когда настраивать

Как выбрать уровень кастомизации?

Дизайн-система имеет три уровня кастомизации. Выберите подходящий:

ЗадачаУровеньЧто изменить
Изменить фирменный цвет во всём SDKТокенChatColors
Изменить шрифты во всём SDKТокенChatTypography
Заменить иконкиТокенChatImages
Настроить кнопку, панель или виджет во всём SDKКомпонентChatComponents
Настроить элемент только в экране чатаСценарийChatFlow
Настроить элемент только в экране поискаСценарийSearchFlow
Общее правило

Токены → меняют значения по умолчанию глобально. Компоненты → меняют готовые виджеты глобально. Сценарии (Flows) → позволяют переопределить любой компонент для конкретного экрана, не затрагивая остальные.

Маршруты в зависимости от задачи

Применить фирменный стиль:

  1. Задайте цвета → ChatColors
  2. При необходимости замените шрифты → ChatTypography
  3. Примените тему: chatCenterSDK.theme = ChatTheme(colors: colors)

Детальная настройка компонентов:

  1. Настройте компоненты → ChatComponents
  2. Изучите список стилей → Стили
  3. Примените через ChatTheme(components: components)

Переопределить элемент только на одном экране:

  1. Создайте тему с базовыми настройками
  2. Получите нужный flow: theme.flows.chatFlow или theme.flows.searchFlow
  3. Переопределите нужный стиль → Сценарии

Базовые настройки

На базовом уровне можно задать общие для всего SDK стили:

Переопределение не обязательное — по умолчанию используются стандартные настройки.

Метод apply

Все объекты дизайн-системы (ChatTheme, ChatColors, ChatTypography, ChatImages, ChatComponents, стили и сценарии) поддерживают метод apply для удобной настройки:

theme.flows.chatFlow.apply {
$0.incomeMessages.showAvatar = true
$0.outcomeMessages.showAvatar = false
$0.inputViewStyle.sendButtonStyle.tintColor = .white
}

apply возвращает тот же объект — используйте его для точечной настройки существующих стилей. Для создания нового стиля с нуля используйте фабричный метод build.

Расширенные настройки

Для точечной кастомизации отдельных элементов используйте стили через пользовательские сценарии. Например, можно поменять цвет кнопки только на конкретном экране, не затрагивая остальные.

Рекомендации по производительности

  • Создавайте ChatTheme один раз — при инициализации SDK (в AppDelegate / SceneDelegate), а не перед каждым открытием чата
  • Используйте SF Symbols вместо растровых изображений там где возможно — они масштабируются без потери качества и весят меньше
  • Для адаптивных цветов предпочтительнее один UIColor(dynamicProvider:) вместо двух объектов ChatColors с theme/darkTheme — если отличаются только оттенки
  • Не переиспользуйте один ChatComponents в разных ChatTheme — изменения в одной теме затронут другую (подробнее в Быстром старте)
  • iPad и большие экраны: SDK автоматически адаптируется к iPad. При фиксированных размерах шрифтов проверяйте их на iPad — на больших экранах может потребоваться ofSize: 16–17 вместо 15
  • Dynamic Type: если приложение поддерживает Dynamic Type, передавайте масштабируемые шрифты через UIFontMetrics:
    let baseFont = UIFont.systemFont(ofSize: 15, weight: .regular)
    typography.message = UIFontMetrics.default.scaledFont(for: baseFont)
  • Когда производительность критична: на iPhone SE / iPhone 8 — избегайте создания ChatTheme в цикле или перед каждым вызовом getChat(). На iPhone 12+ разница незначительна.
  • SF Symbols vs растровые изображения: SF Symbol рендерится на GPU без отдельной аллокации памяти — предпочтительнее для иконок кнопок. Растровые PNG/PDF лучше для сложных кастомных иллюстраций.

Типичные сценарии кастомизации

СценарийКод
Сменить фирменный цветcolors.link = .myBrandColor
Скрыть аватар в исходящихchatFlow.outcomeMessages.showAvatar = false
Задать кастомный шрифт для сообщенийtypography.message = .systemFont(ofSize: 15)
Изменить цвет пузыря сообщенияchatFlow.incomeMessages.bubbleTintColor = .systemBlue
Заменить иконку отправкиimages.sendButtonImage = ChatImage(system: "arrow.up")
Задать тёмную темуchatCenterSDK.darkTheme = darkTheme
Скрыть навигационную панельchatFlow.navigationBarStyle.hidden = true

Если что-то идёт не так — смотрите Troubleshooting.

Быстрый поиск: куда идти

Хочу...ФайлКласс / свойство
Применить фирменный цветЦветаChatColors.link
Заменить шрифт в пузыряхТипографикаChatTypography.message
Заменить иконку отправкиИзображенияChatImages.sendButtonImage
Настроить навигационную панельКомпонентыChatComponents.navigationBarStyle
Скрыть аватар у исходящихСценарииchatFlow.outcomeMessages.showAvatar
Изменить цвет выделения в поискеСценарииsearchFlow.searchMessageStyle.matchTextStyle.color
Настроить аудиоплеерКомпонентыChatComponents.audioPlayerStyle
Задать тёмную темуБыстрый стартchatCenterSDK.darkTheme
Найти все классы стилейСтили
Что-то не работаетTroubleshooting
Изменить цвет кнопки отправки (везде)Компонентыcomponents.inputViewStyle.sendButtonStyle.tintColor
Изменить цвет кнопки отправки (только чат)СценарииchatFlow.inputViewStyle.sendButtonStyle.tintColor
Настроить пустой экран чатаКомпонентыcomponents.chatPlaceholderStyle