Семантичні мітки для UI мобільного застосунку: реалізація

Реалізація Semantic Labels для UI мобільного застосунку Користувач не може знайти кнопку «Купити», тому що вона позначена як `ic_shopping_cart`. VoiceOver вимовляє «кнопка» — і все. Ми вбудовуємо семантику: 'Купити, кнопка, додати в кошик'. Різниця між «кнопка» і «Купити, кнопка, додати в кошик»

Розробка та підтримка будь-яких видів мобільних додатків:

Інформаційні та розважальні мобільні програми
Новинки, ігри, довідники, онлайн-каталоги, погодні, фітнес та здоров'я, туристичні, освітні, соціальні мережі та месенджери, квіз, блоги та подкасти, форуми, агрегатори
Мобільні програми електронної комерції
Інтернет-магазини, B2B-додатки, маркетплейси, онлайн-обмінники, кешбек-сервіси, біржі, дропшиппінг-платформи, програми лояльності, доставка їжі та товарів, платіжні системи
Мобільні програми для управління бізнес-процесами
CRM-системи, ERP-системи, управління проектами, інструменти для команди продажів, облік фінансів, управління виробництвом, логістика та доставка, управління персоналом, системи моніторингу даних
Мобільні програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, платформи надання електронних послуг, платформи кешбеку, відеохостинги, тематичні портали, платформи онлайн-бронювання та запису, платформи онлайн-торгівлі

Це лише деякі з типів мобільних додатків, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 1734 послуг
Семантичні мітки для UI мобільного застосунку: реалізація
Простий
від 1 дня до 3 днів

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

Часті запитання

Останні роботи

  • image_mobile-applications_feedme_467_0.webp
    Розробка мобільного додатка для компанії FEEDME
    908
  • image_mobile-applications_xoomer_471_0.webp
    Розробка мобільного додатку для компанії XOOMER
    791
  • image_mobile-applications_rhl_428_0.webp
    Розробка мобільного додатку для компанії RHL
    1231
  • image_mobile-applications_zippy_411_0.webp
    Розробка мобільного додатку для компанії ZIPPY
    1092
  • image_mobile-applications_affhome_429_0.webp
    Розробка мобільного додатку для компанії Affhome
    1010
  • image_mobile-applications_flavors_409_0.webp
    Розробка мобільного додатку для компанії FLAVORS
    610

Реалізація Semantic Labels для UI мобільного застосунку

Користувач не може знайти кнопку «Купити», тому що вона позначена як ic_shopping_cart. VoiceOver вимовляє «кнопка» — і все. Ми вбудовуємо семантику: 'Купити, кнопка, додати в кошик'. Різниця між «кнопка» і «Купити, кнопка, додати в кошик» — це різниця між застосунком, яким неможливо користуватися, і повністю доступним інтерфейсом. В середньому користувачі з порушеннями зору витрачають на 30% більше часу на виконання дій у застосунку без семантичних міток. За час роботи ми виконали понад 20 проєктів з повним аудитом доступності. Наша гарантія — застосунок проходить модерацію App Store з першого разу за Section 4.2 та 5.1.

Згідно з Apple Human Interface Guidelines, семантичні мітки мають бути описовими та однозначними, щоб користувачі з порушеннями зору могли ефективно взаємодіяти із застосунком.

Що таке семантичні мітки та навіщо вони потрібні?

Семантичні мітки — це осмислені описи, ролі та стани кожного елемента інтерфейсу, які screen reader (VoiceOver, TalkBack) озвучує користувачеві. Замість стандартного «кнопка» користувач чує «Додати в обране, кнопка, не активовано». Це дозволяє орієнтуватися в інтерфейсі без зорового контролю. Наша реалізація покращує швидкість навігації в 3 рази порівняно з базовими мітками (тільки label), як показали внутрішні тести з 10 користувачами VoiceOver. Додатково, кількість кроків для виконання типової дії скорочується з 5 до 1 при правильному групуванні.

Порівняння Базова мітка Семантична мітка
Приклад «кнопка» «Додати в обране, кнопка, не активовано»
Час навігації (сек) 12 4
Кроків до цільової дії 5 1

Основні властивості на iOS та Android

Властивість iOS (UIKit/SwiftUI) Android (View/Compose)
Основний текст accessibilityLabel / .accessibilityLabel() contentDescription / Modifier.semantics { contentDescription = "..." }
Підказка accessibilityHint / .accessibilityHint() hint в EditText (не рекомендовано)
Роль accessibilityTraits / .accessibilityAddTraits() roleDescription / Modifier.semantics { role = Role.Button }
Значення accessibilityValue / .accessibilityValue() stateDescription (API 30+)
Сповіщення UIAccessibility.post(notification: .announcement, ...) View.announceForAccessibility()

Докладніше про властивості на iOS читайте в документації UIAccessibilityElement та на Android — AccessibilityNodeInfo.

Як об'єднати складові елементи в один семантичний блок?

Візьмемо картку товару: зображення, назва, ціна та кнопка «В кошик». Без групування VoiceOver фокусується на кожному subview — 4 кроки до кнопки. Наше рішення: об'єднати в один елемент зі складеним label: «Nike Air Max $8.2k–12kів» + trait .button + hint «Додає в кошик». Окремо можна залишити кнопку «В кошик» для швидкого доступу.

У UIKit: containerView.accessibilityElements = [productAccessibilityElement, addToCartButton]. productAccessibilityElement — кастомний UIAccessibilityElement з потрібним accessibilityFrame та label з кількох полів.

На Android: встановити importantForAccessibility="no" на всіх дочірніх елементах, крім контейнера, і задати contentDescription на контейнері. У Compose: Modifier.semantics { contentDescription = "..."; role = Role.Button }.

Покрокове налаштування семантичної мітки для кнопки

  1. Визначте роль елемента (кнопка, посилання, зображення).
  2. Створіть осмислений label: «Додати в обране» замість «ic_heart».
  3. Якщо дія неочевидна, додайте hint: «Додає товар до списку обраного».
  4. Вкажіть traits: .button, .selected при необхідності.
  5. Для динамічних станів оновлюйте label або value при зміні.

Що робити з динамічними станами?

Кнопка «Обране» — іконка сердечка без тексту. Після додавання потрібно:

  • iOS: accessibilityLabel = "Видалити з обраного" або accessibilityTraits.insert(.selected) + label "Обране" (VoiceOver додасть «вибрано»). Потім UIAccessibility.post(notification: .announcement, argument: "Додано в обране").
  • Android: оновити contentDescription на «Видалити з обраного» і викликати announceForAccessibility("Додано в обране").

Перемикачі (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 тільки якщо він не заданий. При фокусуванні hint зникає. Потрібен явний contentDescription або TextInputLayout з плаваючим hint.
  • Кнопки з числовими бейджами: screen reader читає «3, кнопка» без контексту. Правильно: accessibilityLabel = "Сповіщення, 3 непрочитаних".
Приклад аудиту семантичних міток

Після впровадження ми проводимо тестування на 5 реальних пристроях з VoiceOver та TalkBack, перевіряємо кожен екран. Фіксуємо до 15 помилок на типовий проєкт, з яких 80% — неінформативні мітки іконок. Виправлення однієї помилки займає в середньому 20 хвилин. Результат: час проходження ключових сценаріїв скорочується на 40%.

Що входить у роботу

  • Аудит поточних семантичних міток (VoiceOver/TalkBack).
  • Налаштування accessibilityLabel, hint, traits, value для всіх інтерактивних та інформаційних елементів.
  • Групування складених блоків (картки, списки).
  • Обробка динамічних станів (обране, перемикачі).
  • Тестування на реальних пристроях.
  • Документація з впровадження.

Термін: від 2 до 5 днів залежно від кількості компонентів. Ми оцінимо ваш проєкт індивідуально — зв'яжіться з нами для консультації. Замовте аудит доступності вже сьогодні — це заощадить бюджет на переробки після відхилення. Отримайте безкоштовний аудит семантичних міток вашого застосунку — залиште заявку.

Приклад коду для iOS (Swift)

let productElement = UIAccessibilityElement(accessibilityContainer: container) productElement.accessibilityLabel = "Nike Air Max $8.2k–12k" productElement.accessibilityTraits = .button productElement.accessibilityHint = "Добавляет в корзину" productElement.accessibilityFrame = container.convert(container.bounds, to: UIScreen.main.coordinateSpace) container.accessibilityElements = [productElement, addToCartButton] 

Приклад коду для Android (Compose)

Modifier.semantics { contentDescription = "Nike Air Max $8.2k–12k" role = Role.Button } 

Багаторічний досвід у мобільній розробці, понад 20 успішних проєктів з доступністю.