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

Стили

Быстрый поиск стиля

Ищете стиль для...Класс
Навигационная панельNavigationBarStyle
Поле ввода текстаChatInputTextStyle
Панель ввода (кнопки + поле)ChatInputStyle
Запись голосаChatInputVoiceStyle
АудиоплеерAudioPlayerStyle
Поисковая строкаSearchBarStyle
Экран загрузкиChatLoadingStyle
Индикатор загрузкиLoadingIndicatorStyle
Пустой чатChatPlaceholderStyle
Ошибка загрузкиChatPlaceholderErrorStyle
Текстовое сообщениеTextChatMessageStyle
Сообщение с файломFileChatMessageStyle
Сообщение с изображениемImageChatMessageStyle
Голосовое сообщениеAudioChatMessageStyle
Опрос / оценкаSurveyChatMessageStyle
ЦитатаQuoteStyle
Быстрые ответы (бот)QuickReplyStyle
Результат поискаSearchChatMessageStyle
Меню вложенийChatMenuStyle
Toast-уведомлениеToastAlertStyle
Кнопка прокрутки к новымScrollToMessageButtonStyle

Внешний вид каждого элемента контролируется через соответствующий класс стиля. Визуальные образцы — на страницах Components и User Flow в Figma.

Класс стиляОписаниеДизайн
Базовые элементы интерфейса
NavigationBarStyleСтиль навигационной панели в чатеИспользование
ChatLoadingStyleОбщий стиль экрана загрузки чатаИспользование
ChatPlaceholderStyleСтиль пустого состояния чата (например, нет сообщений)Использование
ChatPlaceholderErrorStyleСтиль отображения ошибки (например, не удалось загрузить чат)Использование
LoadingIndicatorStyleСтиль индикатора загрузки (в сообщениях, действиях)Использование
ChatInputStyleСтиль панели ввода сообщений в чатеИспользование
ChatInputTextStyleСтиль контейнера ввода текстаИспользование
ChatInputVoiceStyleСтиль элемента записи голосовых сообщенийИспользование
ChatInputQuoteStyleСтиль элемента отображения цитаты над полем ввода. См. предупреждение нижеИспользование
SearchBarStyleСтиль поисковой строки в панели навигацииИспользование
ToastAlertStyleСтиль всплывающих уведомлений (toast)Использование
ScrollToMessageButtonStyleКнопка прокрутки к новым сообщениям. alwaysShow (постоянное отображение) применяется только к кнопке «вниз» в ChatFlow.scrollToBottomUnreadMessagesButtonStyle; для верхней кнопки этот флаг игнорируется. badgeStyle: ChatTextStyle задаёт шрифт и цвет числа на бейдже непрочитанных.
ChatMenuStyleСтиль меню добавления вложенийИспользование
ProgressViewStyleСтиль индикатора прогресса (загрузка файлов и т.п.)
ButtonStyleБазовый стиль кнопки в чате
TextButtonStyleТекстовая кнопка (без фона)
IconButtonStyleКнопка с иконкой
NavigationBarButtonStyleКнопка в навигационной панели с поддержкой позиционирования
AudioPlayerStyleСтиль аудиоплеера (в чате или отдельно)Использование
ChatInputQuoteStyle: ограничение в 5.8.x

Свойства titleTextStyle и subtitleTextStyle класса ChatInputQuoteStyle в текущей версии не применяются — панель цитаты над полем ввода использует только messageAuthorTextStyle (заголовок цитаты) и messageTextStyle (текст цитируемого сообщения). См. Известные ограничения.

Стили экрана поиска

НазваниеОписаниеДизайн
SearchFlowСтиль экрана поиска: searchMessageStyle (SearchChatMessageStyle), notFoundImage, notFoundTextStyleИспользование

Стили сообщений

НазваниеОписаниеДизайн
ChatMessagesStylesКонтейнер стилей сообщений одного направления (исходящие или входящие)
ChatMessageStyleБазовый стиль сообщения в чате
TextChatMessageStyleСтиль текстового сообщенияИспользование
FileChatMessageStyleСтиль сообщения с файломИспользование
SearchChatMessageStyleСтиль выделения при поиске в сообщенияхИспользование
ImageChatMessageStyleСтиль изображения в сообщенииИспользование
AudioChatMessageStyleСтиль аудиосообщенияИспользование
SurveyChatMessageStyleСтиль опроса/голосования в сообщении. questionButtonColor: ChatButtonColor (с тремя состояниями: normal, highlighted, disabled) заменяет устаревший questionBackgroundColor: UIColor — миграция не 1:1Использование
ScheduleChatMessageStyleСтиль сообщения с расписанием/напоминаниемИспользование
OperatorJoinedChatMessageStyleСтиль сообщения о подключении оператораИспользование
QuickReplyStyleСтиль быстрых ответовИспользование
QuoteStyleСтиль отображения цитирования сообщенийИспользование
OpenGraphViewStyleСтиль отображения OpenGraph в текстовых сообщенияхИспользование

Стили системных сообщений

Системные сообщения (по центру чата) собраны в контейнере ChatSystemMessagesStyles, доступном через chatFlow.systemMessages.

СвойствоТип
operatorJoinedMessageStyleOperatorJoinedChatMessageStyle
scheduleMessageStyleScheduleChatMessageStyle
surveyMessageStyleSurveyChatMessageStyle
dateMessageStyleChatTextStyle
// Задавайте до первого открытия чата: при первом обращении к
// chatFlow.systemMessages все вложенные стили получают значения
// из текущих токенов и больше не отслеживают их изменения.
theme.flows.chatFlow.systemMessages.surveyMessageStyle.questionButtonColor =
ChatButtonColor(normal: .systemBlue, highlighted: .systemTeal, disabled: .systemGray)
theme.flows.chatFlow.systemMessages.dateMessageStyle = ChatTextStyle(
font: .systemFont(ofSize: 12),
color: .secondaryLabel
)

Кнопки навигационной панели

NavigationBarButtonStyle наследует от IconButtonStyle и добавляет свойство позиционирования. Используется для кнопок в верхней панели навигации чата и поиска.

Конструктор:

let backButton = NavigationBarButtonStyle(
image: ChatImage(system: "chevron.left", tintColor: .white),
position: .left,
components: components
)

Основное свойство:

СвойствоТипОписание
positionNavigationBarButtonPositionРасположение кнопки (по умолчанию .right)

Конструктор задаёт backgroundColor = .clear и tintColor = image.tintColor ?? .systemBlue — поэтому цвет иконки берётся из tintColor переданного ChatImage, а фон по умолчанию прозрачный. Чтобы изменить фон или цвет, переопределите свойства уже на созданном экземпляре:

backButton.backgroundColor = .black
backButton.tintColor = .yellow

Перечисление для управления расположением кнопки в навигационной панели:

ЗначениеОписание
.leftРазмещение слева (обычно для кнопки «назад»)
.rightРазмещение справа (по умолчанию)

Пример:

let searchButton = NavigationBarButtonStyle(
image: ChatImage(system: "magnifyingglass", tintColor: .systemBlue),
position: .right,
components: components
)

Перечисления и вспомогательные типы

QuickReplyMode

Режим отображения быстрых ответов (QuickReplyStyle.mode):

ЗначениеОписание
.toolbarКнопки отображаются над панелью ввода
.embedКнопки отображаются внутри чата как часть сообщения (по умолчанию)

ChatAlignment

Горизонтальное выравнивание (QuickReplyStyle.alignment):

ЗначениеОписание
.leftВыравнивание по левому краю
.centerПо центру
.rightПо правому краю (по умолчанию)

ChatInputAlignment

Вертикальное выравнивание кнопок в панели ввода (ChatInputStyle.alignment):

ЗначениеОписание
.topКнопки вверху
.centerПо центру
.bottomВнизу (по умолчанию)

ChatSurveyIcon

Модель иконки для опросов (SurveyChatMessageStyle.voteLikeIcon, voteDislikeIcon, voteIcon):

let icon = ChatSurveyIcon(
unselectedImage: ChatImage(system: "hand.thumbsup"),
selectedImage: ChatImage(system: "hand.thumbsup.fill")
)
surveyStyle.voteLikeIcon = icon

Стили сообщений в пузыре (TextChatMessageStyle, ImageChatMessageStyle, AudioChatMessageStyle, FileChatMessageStyle, SearchChatMessageStyle, SurveyChatMessageStyle, ScheduleChatMessageStyle, OperatorJoinedChatMessageStyle) наследуют от ChatMessageStyle общие свойства:

СвойствоТипОписание
textStyleChatTextStyleСтиль текста сообщения
timeTextStyleChatTextStyleСтиль времени отправки
editedStatusImageChatImageИконка отредактированного сообщения
pendingStatusImageChatImageИконка «отправляется»
deliveredStatusImageChatImageИконка «отправлено»
readStatusImageChatImageИконка «прочитано»
errorTextStyleChatTextStyleСтиль текста при ошибке отправки
errorInfoButtonIconButtonStyleКнопка «i» рядом с сообщением с ошибкой
errorStatusColorUIColorЦвет статуса при ошибке
errorTimeTextStyleChatTextStyleСтиль времени при ошибке
messageBubbleEndMarginCGFloatОтступ от пузыря до края экрана
containerRightOffsetCGFloatОтступ контейнера для исходящих сообщений
containerLeftOffsetCGFloatОтступ контейнера для входящих сообщений

QuoteStyle, OpenGraphViewStyle и QuickReplyStyle наследуют от ChatStyle напрямую и имеют собственный набор свойств.

Уникальные свойства каждого типа сообщений — в API Reference.

Свойства ChatMessagesStyles

Контейнер стилей сообщений одного направления (outcomeMessages / incomeMessages). Помимо вложенных стилей конкретных типов сообщений (textMessageStyle, imageMessageStyle, audioMessageStyle, fileMessageStyle), содержит общие свойства бабла и аватара:

СвойствоТипОписание
bubbleMaskImageChatImageМаска формы пузыря сообщения
bubbleTintColorUIColorЦвет фона пузыря
bubbleMaskInsetsUIEdgeInsetsОтступы маски пузыря
bubbleErrorColorUIColorЦвет пузыря при ошибке отправки
deletedTextStyleChatTextStyleСтиль текста удалённого сообщения
showAvatarBoolПоказывать ли аватар (по умолчанию true)
avatarSizeCGSizeРазмер аватара (по умолчанию 40×40)
avatarOffsetCGFloatОтступ аватара
avatarPlaceholderImageChatImageПлейсхолдер, если аватар не загружен
quoteStyleQuoteStyleСтиль цитат внутри сообщения

При замене chatFlow.incomeMessages новым экземпляром ChatMessagesStyles SDK автоматически зеркалит bubbleMaskImage, если её не задавали явно — см. Глоссарий.

Присвоение bubbleTintColor пересоздаёт текущую bubbleMaskImage с новым цветом — если меняете и маску, и цвет, задавайте bubbleMaskImage после bubbleTintColor.

Стиль можно создать с помощью базового конструктора:

let outcomeMessages = ChatMessagesStyles(components: components)
outcomeMessages.textMessageStyle.textStyle.color = .black
outcomeMessages.showAvatar = showOutcomeAvatar
outcomeMessages.bubbleErrorColor = .red

или с помощью билдера с замыканием для настройки параметров:

let outcomeMessages = ChatMessagesStyles.build(with: components) { messagesStyle in
messagesStyle.textMessageStyle.textStyle.color = .black
messagesStyle.showAvatar = showOutcomeAvatar
messagesStyle.bubbleErrorColor = .red
}

Изменение свойств уже существующего стиля:

// Получение настроек экрана поиска
let searchFlow = theme.flows.searchFlow
searchFlow.navigationBarStyle.hidden = false
searchFlow.navigationBarStyle.searchBarStyle.cancelButtonStyle.tintColor = .white
searchFlow.searchMessageStyle.matchTextStyle.color = .red
searchFlow.notFoundTextStyle = ChatTextStyle(font: typography.message, color: .white)

или через apply:

// Применение настроек для экрана поиска
theme.flows.searchFlow.apply {
$0.navigationBarStyle = NavigationBarStyle.build(with: components, configure: {
$0.hidden = false
$0.backButtonColor = .red
})
$0.searchMessageStyle.apply {
$0.matchTextStyle = .init(font: UIFont.systemFont(ofSize: 20), color: .systemGreen)
$0.nextImage = ChatImage(system: "chevron.forward", tintColor: .systemGreen)
}
$0.navigationBarStyle.searchBarStyle.cancelButtonStyle.tintColor = .red
$0.notFoundTextStyle = ChatTextStyle(font: typography.message, color: .red)
}
backButtonColor — условие применения

Параметр backButtonColor влияет только на кастомную кнопку закрытия (когда showCloseButton=true) при условии, что чат — корневой контроллер в стеке навигации. Цвет системной кнопки «Назад» в обычном UINavigationController этим параметром не управляется.

Типичные ошибки

Изменение компонента затрагивает все экраны

Самая частая ошибка при работе с flows: изменение компонента через apply затрагивает все экраны, потому что компоненты из ChatComponents — это общие объекты.

Решение: создавайте новый экземпляр через build, а не изменяйте существующий:

// Меняет глобально
theme.flows.chatFlow.apply {
$0.inputViewStyle.sendButtonStyle.image = ChatImage(system: "arrow.up")
}

// Точечное переопределение только для chatFlow
let customInputStyle = ChatInputStyle.build(with: components) {
$0.sendButtonStyle.image = ChatImage(system: "arrow.up")
}
theme.flows.chatFlow.inputViewStyle = customInputStyle

Остальные частые ошибки (цвет не применяется, тёмная тема не переключается, аватар не скрывается, шрифт не меняется) — с причинами и решениями в Troubleshooting.