Доступность (Accessibility)
Этот раздел описывает поддержку iOS-функций доступности в SDK ChatCenterUI и рекомендации для интеграторов, у которых требования VoiceOver / Dynamic Type / RTL обязательны.
Поддерживаемые системные функции
| Функция iOS | Поддержка SDK | Комментарий |
|---|---|---|
| VoiceOver | Базовая | Системные UIButton/UILabel имеют accessibilityLabel по умолчанию из текста. SDK не задаёт accessibilityLabel для кастомных кнопок и иконок (IconButtonStyle, элементы из ChatImages) — для соответствия требованиям задавайте лейблы напрямую на UIButton/UIImageView в собственных subviews родительского приложения. |
| Dynamic Type | Частичная | Шрифты, заданные через ChatTypography напрямую (.systemFont(ofSize:)), не масштабируются автоматически. Для поддержки масштабирования оборачивайте в UIFontMetrics: UIFontMetrics.default.scaledFont(for: ...) (см. design-system/intro). Системные элементы (стандартный navigationBar) реагируют на размер шрифта системы. |
| Reduce Motion | Частичная | Системные переходы UIKit соблюдают настройку автоматически, но SDK содержит несколько собственных анимаций (показ/скрытие тостов, панели поиска, превью ссылок) без проверки UIAccessibility.isReduceMotionEnabled. Для строгого соответствия — протестируйте интерфейс с включённой настройкой. |
| Increase Contrast | Системно | Цвета из UIColor.systemX адаптируются. Для пользовательских цветов в ChatColors/ChatComponents обеспечивайте контраст ≥ 4.5:1 (WCAG AA) самостоятельно. |
| Bold Text | Системно | Применяется к системным шрифтам автоматически. На пользовательские шрифты не влияет — для согласованного поведения подключайте только System fonts. |
| Reduce Transparency | Учитывается | На iOS 26+ Liquid Glass становится недоступен при включённой настройке. Extension UIApplication.isLiquidGlassAvailable() возвращает false на iOS < 26 или при включённой настройке Reduce Transparency — используйте в своём коде, если применяете Liquid Glass в кастомных компонентах. |
| RTL (арабский, иврит) | Базовая | Системный UINavigationController и UICollectionView/UITableView-cells зеркалятся автоматически стандартными механизмами UIKit. SDK сам не управляет semanticContentAttribute. Кастомные изображения в ChatImages (стрелки, иконки направления) не зеркалятся — задавайте imageFlippedForRightToLeftLayoutDirection() в коде вашего приложения, либо используйте симметричные иконки. |
RTL-сценарии
Если приложение поддерживает арабский или иврит:
// AppDelegate / тестовый запуск
UIView.appearance().semanticContentAttribute = .forceRightToLeft
Этот вызов — глобальный side-effect: он влияет на весь UIKit в приложении, а не только на SDK. Применяйте его на уровне приложения, осознавая последствия для остальных экранов.
После этого зеркалятся стандартные элементы навигации. Что не зеркалится автоматически:
-
Иконки стрелок в
ChatImages(backButtonImage,nextButtonImage,sendButtonImage,scrollToBottomImage,scrollToTopImage) — SDK не знает их «направления». Если вы определяете кастомныеChatImage, задавайте уUIImage:let arrow = UIImage(systemName: "arrow.right")?.imageFlippedForRightToLeftLayoutDirection() -
Кастомные ячейки сообщений с
.left/.rightalignment — текущая реализация SDK всегда показывает входящие слева, исходящие справа независимо от RTL. Это поведение нельзя изменить черезChatThemeв текущей версии.
Контраст цветов
Минимум 4.5:1 для текста против фона (WCAG AA). Проверьте контрасты в стилях, которые могут быть переопределены через ChatTheme:
| Пара | Где задаётся | Зачем |
|---|---|---|
incomeMessages.textMessageStyle.textStyle.color ↔ incomeMessages.bubbleTintColor | ChatFlow | Текст входящих сообщений (от оператора) |
outcomeMessages.textMessageStyle.textStyle.color ↔ outcomeMessages.bubbleTintColor | ChatFlow | Текст исходящих сообщений (свои) |
textMessageStyle.linkTextStyle.color ↔ bubbleTintColor | TextChatMessageStyle (через income/outcomeMessages.textMessageStyle) | Ссылки в баблах сообщений |
inputViewStyle.inputTextStyle.textStyle.color ↔ фон поля ввода | ChatFlow | Текст в поле ввода (фон поля наследуется от colors.background) |
Используйте Color Contrast Analyser, например модуль ColorSync Utility (macOS) или contrast-ratio.com.
Известные ограничения
| Ограничение | Workaround |
|---|---|
Свои шрифты в ChatTypography не реагируют на Dynamic Type без UIFontMetrics | Оборачивайте каждый UIFont в UIFontMetrics.default.scaledFont(for:) |
Иконки направления в ChatImages не зеркалятся в RTL | UIImage.imageFlippedForRightToLeftLayoutDirection() |
| Layout сообщений (входящие слева, исходящие справа) фиксирован | Не настраивается в текущем мажоре |
SDK не задаёт accessibilityLabel для кастомных стилей кнопок (IconButtonStyle) и иконок из ChatImages | Задавайте accessibilityLabel напрямую на UIButton/UIImageView в собственных subviews родительского приложения |
Связанные разделы
- Цвета — палитра и контраст
- Типографика — настройка шрифтов
- Локализация — поддержка языков, в т.ч. RTL
- Известные ограничения — список ограничений 5.x