Spec-Zone.ru › Kotlin 2

Поддержка специальных возможностей iOS

Поддержка специальных возможностей в Compose Multiplatform позволяет людям с ограниченными возможностями взаимодействовать с пользовательским интерфейсом Compose Multiplatform так же удобно, как с нативным пользовательским интерфейсом iOS:

  • Программы чтения с экрана и VoiceOver могут получать доступ к содержимому пользовательского интерфейса Compose Multiplatform.

  • Пользовательский интерфейс Compose Multiplatform поддерживает те же жесты для навигации и взаимодействия, что и нативный пользовательский интерфейс iOS.

Это стало возможным благодаря тому, что семантические данные, создаваемые API Compose, теперь сопоставляются с нативными объектами и свойствами, используемыми службами специальных возможностей iOS. Для большинства интерфейсов, созданных с помощью виджетов Material, это происходит автоматически.

Эти семантические данные также можно использовать при тестировании и в других сценариях автоматизации: такие свойства, как testTag, корректно сопоставляются с нативными свойствами специальных возможностей, например accessibilityIdentifier. Благодаря этому семантические данные Compose Multiplatform становятся доступны службам специальных возможностей и фреймворку XCTest.

Высококонтрастная тема

Compose Multiplatform использует класс ColorScheme из библиотеки Material3, в которой пока нет встроенной поддержки цветов с высокой контрастностью. Чтобы использовать высококонтрастную тему в iOS, добавьте в палитру приложения дополнительный набор цветов. Для каждого пользовательского цвета необходимо вручную указать его высококонтрастную версию.

В iOS есть настройка специальных возможностей Увеличение контрастности. Её состояние можно определить, проверив значение UIAccessibilityDarkerSystemColorsEnabled. Также можно отслеживать UIAccessibilityDarkerSystemColorsStatusDidChangeNotification. Эти API позволяют переключаться на высококонтрастную палитру, когда соответствующая системная настройка специальных возможностей включена.

При создании палитры используйте средство проверки контрастности, соответствующее WCAG, чтобы убедиться, что выбранный вами цвет onPrimary достаточно контрастирует с основным цветом, onSurface — с цветом поверхности и так далее. Коэффициент контрастности между цветами должен быть не менее 4.5:1. Для пользовательских цветов текста и фона коэффициент контрастности должен составлять 7:1, особенно для мелкого текста. Это относится и к lightColorScheme, и к darkColorScheme.

В этом коде показано, как определить светлую и тёмную высококонтрастные палитры в пакете темы:

import androidx.compose.ui.graphics.Color // Defines a data class to hold the color palette for high-contrast themes data class HighContrastColors( val primary: Color, // Main interactive elements, primary text, top app bars val onPrimary: Color, // Content displayed on top of a 'primary' color val secondary: Color, // Secondary interactive elements, floating action buttons val onSecondary: Color, // Content displayed on top of a 'secondary' color val tertiary: Color, // An optional third accent color val onTertiary: Color, // Content displayed on top of a 'tertiary' color val background: Color, // Main background of the screen val onBackground: Color, // Content displayed on top of a 'background' color val surface: Color, // Card backgrounds, sheets, menus, elevated surfaces val onSurface: Color, // Content displayed on top of a 'surface' color val error: Color, // Error states and messages val onError: Color, // Content displayed on top of an 'error' color val success: Color, // Success states and messages val onSuccess: Color, // Content displayed on top of a 'success' color val warning: Color, // Warning states and messages val onWarning: Color, // Content displayed on top of a 'warning' color val outline: Color, // Borders, dividers, disabled states val scrim: Color // Dimming background content behind modals/sheets ) // Neutral colors val Black = Color(0xFF000000) val White = Color(0xFFFFFFFF) val DarkGrey = Color(0xFF1A1A1A) val MediumGrey = Color(0xFF888888) val LightGrey = Color(0xFFE5E5E5) // Primary accent colors val RoyalBlue = Color(0xFF0056B3) val SkyBlue = Color(0xFF007AFF) // Secondary and tertiary accent colors val EmeraldGreen = Color(0xFF28A745) val GoldenYellow = Color(0xFFFFC107) val DeepPurple = Color(0xFF6F42C1) // Status colors val ErrorRed = Color(0xFFD32F2F) val SuccessGreen = Color(0xFF388E3C) val WarningOrange = Color(0xFFF57C00) // Light high-contrast palette, dark content on light backgrounds val LightHighContrastPalette = HighContrastColors( primary = RoyalBlue, onPrimary = White, secondary = EmeraldGreen, onSecondary = White, tertiary = DeepPurple, onTertiary = White, background = White, onBackground = Black, surface = LightGrey, onSurface = DarkGrey, error = ErrorRed, onError = White, success = SuccessGreen, onSuccess = White, warning = WarningOrange, onWarning = White, outline = MediumGrey, scrim = Black.copy(alpha = 0.6f) ) // Dark high-contrast palette, light content on dark backgrounds val DarkHighContrastPalette = HighContrastColors( primary = SkyBlue, onPrimary = Black, secondary = EmeraldGreen, onSecondary = White, tertiary = GoldenYellow, onTertiary = Black, background = Black, onBackground = White, surface = DarkGrey, onSurface = LightGrey, error = ErrorRed, onError = White, success = SuccessGreen, onSuccess = White, warning = WarningOrange, onWarning = White, outline = MediumGrey, scrim = Black.copy(alpha = 0.6f) )

Управление с помощью трекпада и клавиатуры

Compose Multiplatform для iOS поддерживает дополнительные способы управления устройством. Вместо сенсорного экрана можно включить AssistiveTouch для использования мыши или трекпада либо полный клавиатурный доступ для использования клавиатуры:

  • AssistiveTouch (Настройки | Универсальный доступ | Касание | AssistiveTouch) позволяет управлять iPhone с помощью указателя подключённой мыши или трекпада. Указатель можно использовать для нажатия значков на экране, навигации по меню AssistiveTouch или ввода текста с помощью экранной клавиатуры.

    На iPad подключённая мышь или трекпад сразу работают для выполнения основных действий. Однако, чтобы настроить размер указателя, изменить скорость отслеживания или назначить определённые действия кнопкам, необходимо включить AssistiveTouch.

  • Полный клавиатурный доступ (Настройки | Универсальный доступ | Клавиатуры | Полный клавиатурный доступ) позволяет управлять устройством с помощью подключённой клавиатуры. Для навигации можно использовать такие клавиши, как Tab, а для активации элементов — Пробел.

Тестирование специальных возможностей с помощью фреймворка XCTest

Семантические данные специальных возможностей можно использовать при тестировании и в других сценариях автоматизации. Такие свойства, как testTag, корректно сопоставляются с нативными свойствами специальных возможностей, например accessibilityIdentifier. Благодаря этому семантические данные Compose Multiplatform становятся доступны службам специальных возможностей и фреймворку XCTest.

В тестах пользовательского интерфейса можно использовать автоматизированные проверки специальных возможностей. Вызов performAccessibilityAudit() для XCUIApplication проверит текущее представление на наличие проблем со специальными возможностями так же, как это делает Accessibility Inspector.

func testAccessibilityTabView() throws {
	let app = XCUIApplication()
	app.launch()
	app.tabBars.buttons["MyLabel"].tap()

	try app.performAccessibilityAudit()
}

Настройка синхронизации дерева специальных возможностей

По умолчанию:

  • Дерево специальных возможностей iOS синхронизируется с пользовательским интерфейсом, только когда работают службы специальных возможностей.

  • События синхронизации не записываются в журнал.

Эти настройки можно изменить с помощью нового API Compose Multiplatform.

Выбор режима синхронизации дерева

В Compose Multiplatform 1.8.0 этот режим был удалён, поскольку дерево специальных возможностей синхронизируется лениво и больше не требует дополнительной настройки.

Для отладки и тестирования событий и взаимодействий можно изменить режим синхронизации:

  • Никогда не синхронизировать дерево с пользовательским интерфейсом, например, чтобы временно отключить сопоставление специальных возможностей.

  • Всегда синхронизировать дерево, чтобы оно обновлялось при каждом изменении пользовательского интерфейса и можно было тщательно протестировать интеграцию специальных возможностей.

Помните, что синхронизация дерева после каждого события пользовательского интерфейса может быть полезна для отладки и тестирования, но способна снизить производительность приложения.

Пример включения постоянной синхронизации дерева специальных возможностей:

ComposeUIViewController(configure = {
    accessibilitySyncOptions = AccessibilitySyncOptions.Always(debugLogger = null)
}) {
    // your @Composable content
}

Класс AccessibilitySyncOptions содержит все доступные параметры:

// package androidx.compose.ui.platform

@ExperimentalComposeApi
sealed class AccessibilitySyncOptions {
    
    // Option to never synchronize the accessibility tree
    object Never: AccessibilitySyncOptions

    // Option to synchronize the tree only when Accessibility Services are running
    //
    // You can include an AccessibilityDebugLogger to log interactions and tree syncing events
    class WhenRequiredByAccessibilityServices(debugLogger: AccessibilityDebugLogger?)

    // Option to always synchronize the accessibility tree
    //
    // You can include an AccessibilityDebugLogger to log interactions and tree syncing events
    class Always(debugLogger: AccessibilityDebugLogger?)
}

Реализация интерфейса ведения журнала

Можно реализовать интерфейс AccessibilityDebugLogger, чтобы записывать пользовательские сообщения в выбранный вами источник вывода:

ComposeUIViewController(configure = {
    accessibilitySyncOptions = AccessibilitySyncOptions.WhenRequiredByAccessibilityServices(object: AccessibilityDebugLogger {
         override fun log(message: Any?) {
             if (message == null) {
                 println()
             } else { 
                 println("[a11y]: $message") 
             } 
         } 
    })
}) {
    // your @Composable content
}

Что дальше?

  • Подробнее см. в руководстве по специальным возможностям Apple.

  • Попробуйте проект, созданный с помощью мастера Kotlin Multiplatform, в привычном процессе работы со специальными возможностями iOS.

22 июля 2025 г.
Обработка событий касания с помощью взаимодействия на iOSРуководства по миграции на iOS

© 2010–2026 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/multiplatform/compose-ios-accessibility.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API