VoiceOver — уграђени екрански читач (screen reader) компаније Apple, који изговара сваки елемент интерфејса и омогућава управљање уређајем помоћу гестова. Технологија је уграђена у iOS, iPadOS и macOS на системском нивоу и не захтева инсталацију додатног софтвера. Према подацима Apple Accessibility (2025), VoiceOver подржава преко 40 језика и користи га милиони слепих и слабовидих корисника широм света.
Главно
VoiceOver — је екрански читач (screen reader) уграђен у Apple-ове оперативне системе. Намењен је слепим и слабовидим корисницима и обезбеђује потпуну интеракцију са уређајем без визуелног контакта. VoiceOver изговара све елементе интерфејса: дугмад, линкове, текст, слике, обавештења и системске елементе.
Технологија је први пут представљена 2005. године за macOS, а на iOS-у се појавила са iPhone 3GS 2009. године. Од тада, VoiceOver је постао саставни део Apple-овог екосистема и један од главних аргумената у прилог приступачности платформе. VoiceOver је уграђен на системском нивоу — то значи да ради у било којој апликацији без додатне интеграције од стране програмера, иако квалитет изговарања директно зависи од тога колико добро апликација користи API приступачности iOS-а.
VoiceOver подржава преко 40 језика са природном синтезом говора и прилагођава се регионалним подешавањима гласа. На iOS-у, VoiceOver користи гласовне погоне Siri-ја за српски и друге језике, што обезбеђује максимално природан звук и правилну интонацију у зависности од интерпункције и контекста.
VoiceOver пресреће догађаје додира и тумачи их другачије од стандардног уноса iOS-а. Када корисник додирне екран, VoiceOver не активира елемент испод прста, већ га прво изговара. Тек након двоструког додира, елемент се активира. Ово је кључна разлика која омогућава слепим корисницима да истражују интерфејс без ризика од случајног притиска.
VoiceOver чита елементе интерфејса логичким редом: слева надесно, одозго надоле. Редослед читања се наслеђује из хијерархије приказа iOS-а, али програмер може да га промени путем својства accessibilityElements за сложене распореде. Корисник се може кретати између елемената превлачењем удесно (следећи) и улево (претходни), као и додиром одређеног елемента за његово изговарање.
При сваком померању, VoiceOver изговара тип елемента (дугме, линк, наслов), његов назив (accessibilityLabel), стање (изабрано, искључено) и упутство (accessibilityHint). Ако елемент садржи вредност — на пример, клизач јачине звука — VoiceOver изговара и њу. Accessibility Traits (UIAccessibilityTraits) додатно обавештавају корисника о понашању елемента: да ли је дугме, прекидач, претрага или тастер тастатуре.
Ротор — виртуелна ручица за подешавање која мења режим навигације VoiceOver-а. Корисник окреће ротор са два прста (као ручицу за јачину звука) и бира режим: речи, симболи, наслови, линкови, тачке улаза, редови табеле и други. Режим наслова омогућава брзо пребацивање између H1-H6 на веб-страницама и у апликацијама, а режим симбола — изговарање текста слово по слово, што је корисно при попуњавању формулара или уношењу потврдних кодова.
Програмер може додавати сопствене режиме у ротор путем API-ја UIAccessibilityCustomRotor. На пример, у апликацији за белешке може се додати ротор „Омиљене белешке" или „Недавне измене". Прилагођени ротори значајно убрзавају навигацију у специфичним апликацијама и сматрају се најбољом праксом приступачности на iOS-у.
VoiceOver користи сопствени скуп гестова који се не поклапају са стандардним iOS гестовима. Већина гестова се изводи са три прста уместо једног — то спречава сукобе са уобичајеним управљањем и омогућава VoiceOver-у да ради истовремено са стандардним уносом.
| Радња | Гест | Резултат |
|---|---|---|
| Изговори елемент | Додир 1 прстом | Изговара назив елемента |
| Активирај | Двоструки додир | Притискање дугмета или линка |
| Следећи елемент | Превлачење удесно | Прелазак на следећи |
| Претходни елемент | Превлачење улево | Повратак на претходни |
| Померање | 3 прста превлачење | Померање листе или странице |
| Ротор | 2 прста окретање | Промена режима навигације |
Гест двоструки додир је основни начин активирања елемената у VoiceOver-у. Ако елемент захтева посебну радњу (на пример, превлачење), VoiceOver користи секвенцу „додир — двоструки додир и задржавање" за улазак у режим премештања. Ово омогућава извођење сложених гестова, као што је drag-and-drop, без гледања у екран. VoiceOver такође подржава гест „двоструки додир са два прста" за отказивање радње и „троструки додир" за укључивање/искључивање екранске завесе (Screen Curtain).
Програмер iOS апликације може значајно побољшати интеракцију са VoiceOver-ом путем API-ја UIAccessibility. Основна подешавања приступачности додају се у Interface Builder-у (Identity Inspector → Accessibility), али за сложене интерфејсе потребно је програмско подешавање у коду.
Својство accessibilityLabel поставља текст који VoiceOver изговара за елемент. Ако ознака није постављена, VoiceOver користи текст дугмета или placeholder текстуалног поља. За елементе без текста (иконице, прилагођени прикази), ознака је обавезна. Својство accessibilityTraits одређује тип елемента: дугме, наслов, прекидач, претрага, тастер тастатуре, вредност која се мења, линк и други.
let profileButton = UIButton(type: .custom)
profileButton.setImage(UIImage(named: "avatar"), for: .normal)
profileButton.isAccessibilityElement = true
profileButton.accessibilityLabel = "Кориснички профил"
profileButton.accessibilityTraits = .button
profileButton.accessibilityHint = "Отвара екран подешавања профила"
Заставица isAccessibilityElement укључује подршку за VoiceOver за прилагођене приказе — подразумевано је true само за стандардне елементе (UIButton, UILabel, UITextField). Параметар accessibilityHint додаје упутство: VoiceOver га изговара након паузе ако корисник застане на елементу. Hint треба да опише резултат радње, а не упутство: „Отвара екран подешавања" уместо „Притисните да отворите".
За сложене екране, где логичка група елемената не одговара визуелном редоследу, користи се accessibilityElements — низ који поставља редослед читања. На пример, картица производа садржи слику, назив, цену и дугме „У корпу". Ако су ови елементи хаотично распоређени у хијерархији приказа, accessibilityElements успоставља исправан редослед за VoiceOver.
let productCard = UIView()
let productImage = UIImageView()
let productName = UILabel()
let productPrice = UILabel()
let addToCartButton = UIButton()
productCard.accessibilityElements = [
productImage, productName, productPrice, addToCartButton
]
За обједињавање више елемената у један приступачни елемент користи се UIAccessibilityContainer или accessibilityFrame за преписивање области додира. Ово је корисно када ћелија табеле садржи више UI компоненти, али логички представља један елемент — VoiceOver треба да изговори целу ћелију у целини, а не да прегледа њен садржај појединачно.
Исправно подешавање приступачности за VoiceOver захтева пажњу на неколико аспеката: семантичко означавање, динамичка ажурирања, обрада прилагођених елемената и тестирање са правим screen reader-ом.
У SwiftUI-ју, приступачност се подешава кроз модификаторе .accessibilityLabel(), .accessibilityValue(), .accessibilityHint() и .accessibilityAddTraits(). SwiftUI аутоматски наслеђује приступачност из стандардних елемената, али за прилагођене компоненте потребно је експлицитно подешавање. На пример, прилагођени клизач мора да обавести VoiceOver о својој вредности и формату промене.
Slider(value: $volume, in: 0...100)
.accessibilityLabel("Јачина звука")
.accessibilityValue(
Text("\(Int(volume)) процената")
)
.accessibilityAddTraits(.adjustsAudioForAccessibility)
.accessibilityAdjustableAction { direction in
switch direction {
case .increment: volume = min(volume + 5, 100)
case .decrement: volume = max(volume - 5, 0)
}
}
Модификатор accessibilityAdjustableAction додаје могућност промене вредности VoiceOver гестовима: превлачење нагоре — повећање, превлачење надоле — смањење. Без овог модификатора, клизач остаје недоступан за управљање преко screen reader-а. Слично подешавање је потребно за прилагођене stepper-е, picker-е и друге елементе који мењају своју вредност.
Када се садржај на екрану динамички мења (појавило се обавештење, ажурирао се статус учитавања, променила се цена), VoiceOver мора да прими обавештење путем UIAccessibility.post. Без овог позива, screen reader неће сазнати за промене и корисник ће пропустити важне информације. За SwiftUI користи се модификатор .accessibilityAnnouncement().
UIAccessibility.post(
notification: .announcement,
argument: "Цена смањена за 20 процената"
)
// SwiftUI
Text("Цена ажурирана")
.accessibilityAnnouncement(Text("Попуст 20%"))
Обавештења VoiceOver-а треба користити разумно: претерана обавештења иритирају корисника, а њихово одсуство чини апликацију недоступном. Оптимална стратегија — објављивати само оне промене које утичу на тренутни ток рада корисника: ажурирање корпе, статус учитавања, грешка валидације формулара, обавештење у чету. Позадинске промене (време на траци, курс валута) не захтевају објављивање — корисник ће их сам проверити по потреби.
Тестирање VoiceOver-а се врши путем физичког уређаја са укљученим screen reader-ом или iOS симулатора са опцијом Accessibility Inspector. Важно је проверити сценарије потпуног коришћења: без визуелне контроле проћи регистрацију, наручити, пронаћи производ путем претраге. Ако је пут проходан без визуелне повратне информације — VoiceOver је подешен исправно.
Често постављана питања
Подешавања → Општа приступачност → VoiceOver. Укључите прекидач. За брзо укључивање користи се троструки притисак бочног дугмета (на iPhone X и новијим) или дугмета Home. Siri такође може укључити VoiceOver командом „Укључи VoiceOver".
VoiceOver — Apple-ов екрански читач за iOS, TalkBack — Google-ов екрански читач за Android. Принцип рада је исти: додир изговара, двоструки додир активира. Разлика је у гестовима, подешавањима ротора и екосистемским интеграцијама: VoiceOver је дубље интегрисан са iCloud и Apple Pay.
Користите API UIAccessibility: поставите accessibilityLabel за све елементе, accessibilityTraits за тип елемента и accessibilityHint за упутства. У SwiftUI-ју примењујте модификаторе .accessibilityLabel() и .accessibilityAddTraits(). Тестирајте апликацију са укљученим VoiceOver-ом.
Ротор — режим навигације који се мења окретањем два прста. Одређује како се кретати између елемената: по насловима, симболима, речима, линковима или тачкама улаза. Програмери могу додати своје режиме путем UIAccessibilityCustomRotor.
За прилагођене UIView-ове потребно је поставити isAccessibilityElement = true и задати accessibilityLabel. Ако се елемент састоји од више подређених приказа, користите accessibilityElements за одређивање редоследа читања или их обједините у контејнер.
Резиме
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође