›
›
Accessibility на iOS - шпаргалка
iOS гайд
Accessibility на iOS - шпаргалка
Практический справочник, как делать приложения для iPhone и iPad удобными с VoiceOver, крупным текстом, Switch Control и системными настройками доступности.
Все материалы
1. Зачем это нужно
Лучше UX для всех: крупный текст, понятный фокус, меньше укачивания от анимаций.
App Store и HIG Apple ожидают базовую доступность.
Многие правки - маленькие API-решения: labels, traits и Dynamic Type.
2. Базовые API (UIKit + SwiftUI)
Задача UIKit SwiftUI
Доступное имя accessibilityLabel.accessibilityLabel()
Подсказка accessibilityHint.accessibilityHint()
Значение (slider, switch) accessibilityValue.accessibilityValue()
Роль / поведение accessibilityTraits.accessibilityAddTraits()
Скрыть декоративное isAccessibilityElement = false.accessibilityHidden(true)
Сгруппировать детей container + combine .accessibilityElement(children: .combine)
Свои действия UIAccessibilityCustomAction.accessibilityAction()
3. Labels для VoiceOver
Описывайте действие, а не картинку: "Удалить сообщение", а не "Красная корзина".
Держите label коротким; детали - в hint.
Не дублируйте уже видимый текст в label, если VoiceOver и так его читает.
Для кнопок только с иконкой label обязателен.
Обновляйте label/value при смене состояния (Играет / Пауза, Выбрано / Не выбрано).
// SwiftUI
Button(action: delete) {
Image(systemName: "trash")
}
.accessibilityLabel("Удалить сообщение")
.accessibilityHint("Удаляет это сообщение из чата")
// UIKit
button.accessibilityLabel = "Удалить сообщение"
button.accessibilityHint = "Удаляет это сообщение из чата"
button.accessibilityTraits = .button
4. Traits и роли
Trait Когда использовать
.buttonНажимаемый контрол с действием
.linkПереход на другой экран / URL
.headerЗаголовок секции для ротора
.selectedТекущий таб, chip или выбранная ячейка
.adjustableSlider / stepper со свайпом вверх-вниз
.imageОсмысленная картинка (не декор)
.updatesFrequentlyЖивые значения (таймер, % загрузки)
Выбирайте одну понятную роль. Конфликтующие traits путают VoiceOver.
5. Dynamic Type
Используйте text styles (body, headline, footnote), а не только фиксированный размер.
В UIKit: label.adjustsFontForContentSizeCategory = true вместе со style-шрифтом.
В SwiftUI: .font(.body) / семантические стили; проверяйте самые крупные Accessibility sizes.
Вёрстка не должна обрезать и наезжать текст на XXXL.
Лучше перенос строки, чем обрезка важного текста.
// UIKit
label.font = .preferredFont(forTextStyle: .body)
label.adjustsFontForContentSizeCategory = true
label.numberOfLines = 0
// SwiftUI
Text("Настройки аккаунта")
.font(.title2)
.fixedSize(horizontal: false, vertical: true)
6. Анимация, контраст и системные настройки
Настройка Что делать
Reduce Motion Убрать сильный parallax/zoom, оставить fade или без анимации
Increase Contrast Усилить границы и контраст текста/фона
Bold Text Не опираться только на сверхтонкие шрифты
Differentiate Without Color Не передавать ошибку/статус только цветом
Button Shapes Текстовые кнопки должны оставаться похожими на кнопки
// SwiftUI пример Reduce Motion
@Environment(\.accessibilityReduceMotion) var reduceMotion
withAnimation(reduceMotion ? nil : .easeInOut) {
isExpanded.toggle()
}
7. Порядок фокуса и группировка
Порядок чтения должен совпадать с визуальным (слева направо, сверху вниз).
Заголовок + подзаголовок + meta карточки часто лучше объединять в один элемент.
Декоративные картинки и разделители скрывайте от VoiceOver.
После закрытия модалки / навигации возвращайте фокус в понятное место.
У кастомных контролов должна быть нормальная accessibility-рамка (около 44x44 pt).
8. Чеклист перед релизом
# Проверка
1 У каждой icon-кнопки есть label
2 Ошибки форм объявляются текстом, а не только красным цветом
3 Dynamic Type на максимальных размерах не ломает UI
4 VoiceOver проходит главные пользовательские сценарии
5 Для Reduce Motion есть спокойная альтернатива
6 Важные изображения описаны, декоративные скрыты
7 Выбранные состояния доступны через traits/value
8 Заголовки sheet/dialog объявляются как headers
9. Как тестировать на устройстве
Настройки - Универсальный доступ - VoiceOver (или Accessibility Inspector на Mac).
Жесты: свайп - следующий элемент, double-tap - активировать, two-finger scrub - назад.
Настройки - Экран и размер текста - Крупный текст - проверьте максимум.
Включите Reduce Motion и Increase Contrast и пройдите ключевые экраны.
Для автоматизации: XCTest accessibility audits / предупреждения Accessibility Inspector.