Реализация Semantic Labels для элементов интерфейса мобильного приложения

TRUETECH занимается разработкой, поддержкой и обслуживанием мобильных приложений iOS, Android, PWA. Имеем большой опыт и экспертизу для публикации мобильных приложений в популярные маркеты Google Play, App Store, Amazon, AppGallery и другие.

Разработка и поддержка любых видов мобильных приложений:

Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

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

Услуги, которые мы предлагаем
Показано 1 из 1Все 1735 услуг
Реализация Semantic Labels для элементов интерфейса мобильного приложения
Простой
от 1 дня до 3 дней
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    792
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    671
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1097
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    969
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    914
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    495

Реализация Semantic Labels для элементов интерфейса мобильного приложения

Semantic Labels — это не просто accessibilityLabel. Это правильно выстроенная система описаний, подсказок, ролей и состояний для каждого элемента интерфейса, которую screen reader озвучивает пользователю. Разница между «кнопка» (VoiceOver читает что-то по умолчанию) и «Добавить в избранное, кнопка, не активировано» — это разница между приложением, которым можно пользоваться, и приложением, которым нельзя.

Из чего состоит полное описание элемента

Label, Hint, Trait, Value

На iOS это четыре отдельных свойства UIAccessibilityElement:

  • Label — что это: «Фото профиля Ивана Петрова», «Кнопка отправить»
  • Hint — что произойдёт при активации (необязателен если label самодостаточен): «Открывает страницу профиля»
  • Traits — тип и состояние: .button, .link, .image, .header, .selected, .notEnabled
  • Value — текущее значение для элементов с состоянием: слайдер «громкость 70%», переключатель «включено»

VoiceOver озвучивает их в порядке: label → value → traits → hint. Пауза между label и value, пауза перед hint.

В SwiftUI: .accessibilityLabel(), .accessibilityHint(), .accessibilityAddTraits(), .accessibilityValue().

На Android аналог: contentDescription (= label + value), AccessibilityNodeInfo.setRoleDescription() (= custom trait), stateDescription (API 30+).

Составные элементы

Карточка товара с изображением, названием, ценой и кнопкой «В корзину»:

Плохо: VoiceOver фокусируется на каждом subview отдельно — 4 шага, чтобы добраться до кнопки. Screen reader читает: «изображение», «Nike Air Max 90», «8 900 рублей», «кнопка».

Правильно: объединить в один элемент с составным label: «Nike Air Max 90, 8 900 рублей» + trait .button + hint «Добавляет в корзину». Плюс отдельный элемент — кнопка «В корзину» — если пользователю нужен быстрый доступ к ней без прочтения всей карточки.

В UIKit: containerView.accessibilityElements = [productAccessibilityElement, addToCartButton]. productAccessibilityElement — кастомный UIAccessibilityElement с нужным accessibilityFrame и label из нескольких полей.

Динамические состояния

Кнопка «Избранное» — иконка сердечка, без текста, меняет состояние. Базовый label «Добавить в избранное». При добавлении — нужно обновить:

  • iOS: accessibilityLabel = "Удалить из избранного", или через accessibilityTraits.insert(.selected) + label «Избранное» (VoiceOver добавит «выбрано»)
  • После изменения: UIAccessibility.post(notification: .announcement, argument: "Добавлено в избранное") — мгновенное уведомление без перефокусировки

Переключатели (UISwitch, Toggle в SwiftUI, Switch в Compose) — состояние озвучивается автоматически: «Уведомления, включено». Для кастомных toggle — нужно задавать accessibilityValue = isOn ? "включено" : "выключено".

Группы-заголовки

Экран с несколькими секциями: accessibilityTraits = .header у заголовка секции — пользователь VoiceOver может перемещаться между заголовками свайпом с выбором «Headings» в accessibility rotor. Без этого нельзя быстро перейти к нужной секции без линейного обхода всех элементов.

В Compose: Modifier.semantics { heading() } у Text-заголовка.

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

Иконки кнопок — contentDescription = "ic_heart" (название файла ресурса) вместо «Добавить в избранное». Android Studio предупреждает, но разработчики часто оставляют как есть.

Placeholder в TextField как label: hint = "Введите email" в Android EditText — TalkBack прочитает hint как contentDescription только если contentDescription не задан. При фокусировке hint исчезает и описание пропадает. Нужен явный contentDescription или использование TextInputLayout с hint, который плавает при фокусе.

Кнопки с числовыми бейджами: «3» рядом с иконкой колокольчика — screen reader читает «3, кнопка» без контекста. Нужно: accessibilityLabel = "Уведомления, 3 непрочитанных".

Срок: 1-3 дня в зависимости от количества компонентов. Часто совмещается с VoiceOver/TalkBack аудитом. Стоимость рассчитывается индивидуально.