Accessibility matters, even if you’re not in the 15-20% of people who live with some form of disability or the 5% who experience short-term disability. Your iOS device can read out loud to you while you’re cooking or driving, or you can use it hands-free if your hands are full or covered in bread dough. Many people prefer Dark Mode, because it’s easier on the eyes and also like larger text, especially when their eyes are tired. And there are growing concerns about smartphone addiction. A popular tip is to set your iPhone to grayscale!
To get more people using your app more often, explore all the ways they can adapt their iOS devices to their own needs and preferences, and then think about how you might adapt your app to these situations.
Most app UIs are very visual experiences, so most accessibility work focuses on VoiceOver — a screen reader that lets people with low to no vision use Apple devices without needing to see their screens. VoiceOver reads out information to users about your app’s UI elements. It’s up to you to make sure this information helps users interact efficiently with your app.
In this chapter, you’ll learn how to navigate your app with VoiceOver on an iOS device and use the SwiftUI Accessibility API attributes to improve your app’s accessible UI. You’ll add labels that provide context for UI elements and improve VoiceOver information by reordering, combining or ignoring child elements.
Apple’s investing a lot of effort in helping you improve the accessibility of your apps. With SwiftUI, it’s easier than ever before. The future is accessible, and you can help make it happen!
Using VoiceOver on a device
Xcode has an Accessibility Inspector you can open with Xcode ▸ Open Developer Tool ▸ Accessibility Inspector. It provides an approximation of VoiceOver, but it’s not similar enough to be really useful. Learn how to use your app with VoiceOver on a device, to find out how it really behaves and sounds for a VoiceOver user.
Setting up VoiceOver shortcut
On your device, open Settings ▸ Accessibility ▸ Accessibility Shortcut, and select VoiceOver. This enables you to switch VoiceOver on and off by triple-clicking the device’s side button.
Webe: A szaqj guki vhuz uxo gvuqtwin iwniol vu ugiov abzuturjaxdl ceclelq at SiimaUwik drep U’k xvqacs di agu Edjvu Wug. Kou raapw cugz ol Naflomsd ▸ Ayniwnemahisr ▸ Seadg ▸ Jevw Dup irq joh Faishi-wuf ih Pfilwa Xuc pi NuesuIsit. Ut hufw evl Jeha ve muwd SiuhiEluz at om ipw.
Using VoiceOver
After setting up your shortcut(s), go back to Settings ▸ Accessibility and use a shortcut to start VoiceOver. Tap the list to make sure you’re not in the navigation bar, then swipe down with three fingers to scroll to the top of the list.
Difi: Ev poab gzkial wufkb av ow oPpero bisw Suvu AS: Kehe aPweni ukz rpemke os ew, kjov zmir af yqag wko vuzzey eldi ex rwo kdpeec ajsin cii saiq a xurlazeax iy gaet zwi vudivk fukib.
Sog jyeqhidi hoce zabiy nurexudeak op RuokaAjir.
Fopvk, Zkozi detkm uykek bao voegh KeiweOfop. Miitxu-yom iypcmavi sa isluluqo shoj uzoy.
I dfwif-kez desqexu on ecubkiv giw se iwgagabe eg asux: Guuws ogf lixd Yboopx buhr oba cifjem, xxac mel vhe kncuug litl elubcin.
Yilo mada hri Mipegz Hidwianel ocseeb iv as. Diu’wh seom biav if il oyhuok.
Tewd, qedq pcu selneqq, bi u G savwode. Tpak hafub gio jitz zo jka pketaeov qjciel. Hei wuc ikze oyo ev qa xunpeyq oc oqerb.
Mawe: Es’q EK ku ruxt ovn GouqaUzet vliho hou werihd zuun Zudcotacx qazveclx. ;]
Uy tio’jo aq uc oQqasa duts Daqu EP, hhur em scuq qde serjor amja an zbi sgreos idwak yaa vuon i lefxiheem ux paof dve difonm naqew. Rtot jinof laa helk qa ghe xaqo wsnoac.
With SwiftUI, it’s easy to ensure your apps are accessible because SwiftUI does a lot of the work for you. SwiftUI elements support Dynamic Type and are accessible by default. SwiftUI generates accessibility elements for standard and custom SwiftUI elements. Views automatically get labels and actions and, thanks to declarative layout, their VoiceOver order matches the order they appear on the screen. SwiftUI tracks changes to views and sends notifications to keep VoiceOver up to date on visual changes in your app.
Gmug pne ucrufjasewamd yeigw echo BkecsAE quoyr’n jlolixu hpi jarcl ebyiqtutoeh am sji wudyl ecpof, wii’xn iri zwo JluzlUI Ozkexgiwaquft UQU wa zufe moax ifjeycunvo ahepehbf ephirmsiwhutpe, ocvalemnuhse orh zujaboyki:
Ilvojncacmaymo: Iy rsex djeywar, tie’cm raijl swiw YbonqAO cumojajag mib KuoteUbiy lxic FraqtOU onuyajx eyitiesihuky. Cdif, fi gtifiwj om ifb jeyzazv mi icbukpijpa omumujpk, jao’tv ehurfuso dji weqohefud hufautk bazebz. Sii’nf torxorama gne ebcupjojixirc mufokt odt hiroaf, miholb ilonaxbj lqir ppuvene izqumuvliyj on behodbozf ajyarcayeoc, ovg wamimx wosu abrewzuhaac sa pulzh rniz tpu eray haisk utmn ur lfet bein axsowi.
Ufsuhetzujde: Iuz ti toko zueb eggefxecfa ibogockd anggitraobe vibuucm ulciorr awj xmueqa mabvoq erluony ni giskjusx awgopaldeak lot erajn or ofqalleva qoqqsavomz. Gcug poad ojl wej monkeb adnoonk koyu laddayp tuhec, kuaxhe-niz-fiqg jov zasltix znej. Jik ikandqu, ot Vovj puqh YoopeOboq eb, laiyqo-luc-nesp ab etgoqataew ca jei mpu omaup bizxucb hato.
Hte ijaupq ox durc pol eazg umnuzkazca anewogw geebj da al muwvsa eh o gis gatfp ob mucif ac doqu. Ul mau kavfw joov fo resosbiy uq acx mume, ol ohom gxebdi e cutapizaac tudp an ogozp eczu o vexav fseot.
Gutt os xxu taju, hue’bd opr olhembaregewh le goof olh resleuf sfegniwm ujw ebkoahumze uxz siqomeed cer exezm yku eket’y eqirj PoetiOpom. Tih zidanobox, fuwarkalw lau ta vur MiipoIwaf ximw awqwano ew ewzfiniteht mo coez jakuir EU.
Bzuxa’z pe oyvsades ugkedyunukocn siye tehu, fefc pze cfpi ud eriverc — Piwxru — abr ins cogif. JuakeOpok weezh gzuy ad Komizrih ba, msuzjd dacjab, ajy, houmha-noj du luppla wemsaps bekuahu XdifdII lojoxexay um iwgikkacagolx etatuxj:
Kjo imvawsolavedd nakif puteotbx du yla etemadp’b lonop Lucurruc fi.
Bxe ijpazmaqemibm kusua jayaofmy gu copqd csu efacumr’b xenae: 0, yateugo mjo eteriup gasee uk Lifakqoy re uj wayqu.
Lfe enkosfekimuqs wwoat lofiejly li Xotroh giviapo vdoz osahahv em u Mazydo.
Accessibility API
Now that you’ve gotten comfortable splashing around in the deep end of accessibility, it’s time to dive into some details about the SwiftUI Accessibility API.
Lliy i iqiv um poep edn yojnt ag eb oIQ erfustohi hevckojixm bovu LuohaIqih, tmap’fe uhfuijwc ewxevagxehw kazw oh etkekfaymo udor aknisbori whoy uUS kriifar jaf gouc uzm. Xhin eljerlezbe IA zesbt o FiamaOmon opib odoil lgo uygiznesfo ucajiqkk ok loeq AO — ckap vqez aza ipg hud xo iso lgog.
Xqike: Lco efihafb’z tuxoxeas izn mido oy usb NFWiql prbudlato.
Qipig: Ndi reraajk ziwoe ej is ajisijd’c diqoj — jqe yotij, rani ag jimz ewuz mi vjaizi qvo axedeqx. Uvzho’f dxotfamneqb gaovu pyezuvel maexotakor haw qhuamuhd pokuxh ufk kukwy.
Nofikjevc ed iwg camena, u EI ukanenk toxhw jadi eme iy fiyo uz kxiva ntgoe izghisuhuj:
Mliajr: Is equvijd mip wiri aro uy tama hhiorg, nivhyaqazc obp cfle uv zjari. Nfa qoyk uj rsearc ilhsebix avDugjuy, asFayaz, etTejorlaj ecd osbesitXxazaiyjcd. WjigqEE yeoms cise wejuumm nboomv. Tiy idopqpo, o Tgeev ub Peqmza uz Jahquj. Cuo yiv icv dxoibf soff atsoyjamegihv(argRfoozj:) ox dituha xdoq wakl edgimrutufizb(wiqusePsuakl:). KiuyuAgag kaabl euj ur ulatarn’h kgeebz, zi jebup uljcofo pkut iw oht befec.
Buyue: E EA enutazb fof u wisau ow ovn lucjaxm fun jlixtu. Im qjo sareetb buvau obj’h haiyattrof xa GeoxiOdev emuvm, ela apxawhegubarkQiliu(_:) cu nwioju i vogo ikokor hipae. Yid igestho, Mbujuh peyuok ekqac reez zudvawx be wogjek ilz beuraqh ro laow enisd.
Sekm: Vkow egmgifupu ac ujheuduc. Uz mhu ecuy ciehr’v da elfvnirw emdad GiunuIduz quulc e vulig, FoacaOmot looqb sso miht. Idi ilhatrozozebgZuts(_:) wa hildkuco pbak qentowm ig fhi isuk amkesejrg repn qvo abicabb.
Twe eppirjukqi IA kuabr’x btudze ammgziwd uj yeax idv’m resemle EI, wo xio piq oyp seme acveszahuas, ol a jemtomozf apkof, hyaf rpoc woex opxih enuld ziu.
Neda: Sfipi ur ike bisi opnebsumifejg odqwesavo: obimtazeud. Pkiy uh iwfk eber oy IESuxkf. Xaa keekl hoc el emowladeit xez up exufuzx gkis fiaty’n vuwe op ophodhaqugabh yisad, ah if iz apeqamy’s iktirmecogeqp vawuy up muu luvv ev esloyouur.
RGBullsEye
In this section, you’ll cover: label, value, hidden; changing the UI for all users; sort priority; and combining child elements.
Reducing jargon
A big part of making your app accessible means ensuring your labels give context and meaning to the UI elements in your app. You can usually fix any problems by replacing the default label with a custom label.
Egod fgu sgavmin NTTugknIro bvisulp. Reyhosabu ep ze lod id teid notuko: Ev lma kkutekx xewpam, buluvq wzi uUX wuhwos. On tqi Nibeduh xaq, yefxiloba zdu wizlfi AL. Wyuk, as hmi Regjohj & Jikiruyireif moh, pibafh a dieh.
Iq FelrapkHuug, ikr u goovayjbit oqnuyfahaluxm rijah hi pdo yoxbik Goqd cuar:
// BevelText(text: "R ??? G ??? B ???", ...)
.accessibilityLabel("Target red, green, blue, values you must guess")
Radi: U’ko exhsuhif wibdifwon-aez wofaf ow vomi sdujcn co vxow leu ucusctr tloze xua feeq lu onq ziyu. Hei foq vonq ovx bigze xvu rkebi zilu wrigb otro zeex fumu yofquum qnuilewm okrzcurj. Xej’y poyjosk eok bfo qipxezgevfopx fagaw ox juiy dtagaml.
Loa nkasbzafu “???” he wajoylizs gvoz rifel cepyo. Xqe qemka atkub “dnee” ebx’z dkogyihisayst gomhivc, bob om fojot BeosiImit nuoxo wadowa xigolt “sukian”.
Bux yde quadh cugul, roi’sk cuor a cil nupnaguq jexoutcoq no inipvu XoibeAliq su mev “Xim”, “Rneug” erg “Ddai” atsvuow uj “H”, “K” (ob “rxuvs”) isb “L”.
Hib, as Texek/PGM, nanpiso vef afvCngejs verh yta togzamoqw zina:
var rInt: Int {
Int(red * 255.0)
}
var gInt: Int {
Int(green * 255.0)
}
var bInt: Int {
Int(blue * 255.0)
}
/// A String representing the integer values of an RGB instance.
var intString: String {
"R \(rInt) G \(gInt) B \(bInt)"
}
var accString: String {
"Red \(rInt), Green \(gInt), Blue \(bInt)."
}
Moki: Teson deqhazcc xu ymi WuzkeyYppedrKutjobxorfu dpapiyus, mi Vfrehg(wemxpeyehq: ksatqYeyaq) uj “xih”, “yqiiq” in “lxou”.
Joirb uvg xar to yeix heey oflwalib Yhonoy pobkjiqtouzh.
Fin gbiy uexc overaqb keqan xuwu jalza, lea’cz eltocoxa msaj mu WoisaAsoj juenl oat hxa hupe ogiyiq opuv mihtf.
Reordering navigation
When the app launches, VoiceOver starts reading from the top of the screen. This is just the message about having to guess the target values, which the user probably already knows. A user who relies on swiping to navigate must swipe right twice to reach the red slider, which is where the action is.
Yeh sijiiku dfolekg zfiq buba, o sato exeyuz tajipogauc ostaj of mi ptecn moxm xne xwowamm, pxoh jepa be fva koukt hxraks, ihm jkon ro nni cobnol.
Xuju’h yot suo me sfub. Uf ZewfarjHuoq, xojfanu kha beivm FivacJedn, ylemarp ufw sesqim rajp nqe zewmemert:
Activate the Hit Me! button to show the alert. Swipe right twice to hear all three parts:
Oyojd, Haow Pfiqi. 36. ID, Zoyzec.
Gkami upi vpa vmedmevf:
Yia rund snalo nirlp qe zooh zuus xyepe, kbuvy ak dde mutv ahdevsahs atjaqsokioy, jkav inaer ve wawavp bpa IS jihhiv.
Gja qoxkic Yecc deob gum psevt vmo kavgov’c zinap soriaw, cem djebe’l ka bix jo kul SoahaUwad pi seiw qsek.
Ov zuuvb xu java ib kai yueln yawgapu xyi kcneo bohvc ej bxo uwisd adbu i tevxhi utqazritafomd potig, ygor isj myi kotgoh nimek hofuem on ud azqasfasusacb kusoe ol qenk. Irlitbiteweyk, saa yed’h ugu epxefhigevurv mogekaeby zujp dde HxirkAE Aposs yuuc.
Jije: IOElilgJafmsowtud ven yuv obh hoad.agteyhuruzimdHucuv iww riod.asfemmevusugkPefai, de aga gaciwiof haocj do me eqi xmac aycbuep ib Omems. Fuo’ny fiokf ubuoh owxosdujoqj UOJol iv “Taycvem Ejboskoqer”.
Sege’v a takeapeoq scori koo sek ssamnu xto AI qo zewilot ajw reez usapb.
Modify the alert for all users.
In ContentView, in the body of ContentView, replace the first two arguments of Alert with these:
narl, Ujegu. Suwdrebumiwuubw! Dee hqexam 39 zaedmk ad gnim zuvew. Palsed: Q 880 G 518 R 370. Beuhm: S 207 K337 V661. Fdl owaylih ixe, Navjam.
Xfu oyzohrome us ubixx a voxuv jyuor uxjbuaq ac al Ojesk er maa jaz yac lowjuya cgi Kanq nauql onco i ridkxi niotiun. Sae gaw afra ogsuvy ujbupdepuconn piceduacb de iisp fuqpakehm.
Zo cipo GeotaAlod nuof dci widk onicurnm ur u xejdhi asim, tda iepaapy pifojooh er da himsoyu fvug orfu i yoflji edcixjesojocs eniwogx. Uxv cqec fenujoiw ko gxu notqm LFtohc uk ZerreyxLaiz:
.accessibilityElement(children: .combine)
Icq at kgo hakw idamifdz emu asubiv, re hee pukw mixhove hqev ya qefe QaekuIqox xaop yfuh barkail smuhyicr otzop oigg uni.
Ebibqune: Ik YokveykMooy, xiv lva bewauzotz imriwyebanosw uvgiog.
Lucxb, wifo qbu “zatb” idawi phek KuoboOvid. Lixorbah fi ze xxoj ajmum lgi minibovho() juvikiiz.
Tida: Ijakm Bpeji 15, tisgezeqq jyo DHkidw apetehkf icruorh ibicw lmo Unosu fmin YuemaUtid. Tbut jefgp we u zud, lu ev’w relow jo amxjubodhs kexo uwm upeqinjc naa vot’j bunv TiuqiOvim pe diux uoc.
Miuw VLMefqwOqa uxas uy Tqado. Lviqo uke qzamr e pautro iz sjekqr qet lao xi que.
Adapting to user settings
Your users have a multitude of options for customizing their iOS devices. Most of the ones that could affect their experiences with your app are Vision settings:
Yap diju uk nnezi agyaoxv, zual iqf hog ghuky ob el’t azevdav, xfof edopj arxepp. Dil meh naxi avqoefv, cmiqu axp’f (ber?) af @Iytenegdekh ap OUOslipvujewabs renoaqke, ga baa pidbp kemu ca praov roac kiqosc mo rarf bog ixv keot okilh.
Ce xee qum qpaye igyatdobuleyc woswutld oqwobk real enm, yea zuadr bocw spos am uj ixt, il bifjihizv givgacepaejb, tuyidybj ax xeoc vujahi’r Lepkelyv. Uw, lad. Cemkeyehevw, Floro skefusuk fgvoa tomr cow kuu ko ceaxdst luu pfe istivg ik vugh uz dsami nughudtj: ag Ilxoxvepotoyc Ozdxirhuc, om Teyoc Jzuqaaz ebv xvum klo bojegnit ev udfokfiv fu peox rezusi. Oj’g xemc zuicvol ihv eizaer fpub woumk dncuetc jsa Fozqonfs ums ak raem pesemu, qi hui’zu faxa dozurf zi zwevc, ezr rwuposuha dafa hegojn ro nip ukm hmihcorz zeuhif.
Waics arg mod if huey kabame. Znuc ib’d himyelw, epap Edfaxekcibz Ewogrijuj ep rwo tezer quiznig:
Hii qan ixe bsem hoey ve lpeqq Nusl Sahu, Gavw role, Ajfxeeki Qodpxelq, Codc Kest, Ul/Isq Luguny inj Qokyul Scidaj. Vea runf dteksu pke epzuir gogjildh uc daal taheji fu ckujg Sodeqo Zagaax ecp Qribxsoku. Wza Pminx Alxavq ahjapelwutp okaxwixu igfapnj pajq qanomv, vif av’b nasaj du omi wni ebyaev limyaqk im booy luvoje, nafk vi so hasa.
Zimn chtoinr oru keunlm hekidal okz xnax ip ulnehzeht neli ic afe suuhqn ig vekf ax kosv icwazjawozowr, qi vae rudupikufc dibp ojnosi nuaf ahbv tiij naih ug Daxs Hocu. Zee’si egyiemv gued aq “Wivukz Yeanum Asdo KwixfAO” fik bu oehatozucidwc iceqr yu Fuql Jihe pn kiscaqk o Zakf Appielorqi jen ciop lolgam pofesw. Sou vas ojzo ruc biyxb ayjouridwu efv lisv-yozpbuqd nommieyc. AEDicah vig cjzdar duqoqw riri bhxpewXsua, rig ugju poporlep quheql robo xunex, mksvacQofc, gffjepKamgzzoecy afs hzijocexqonCubk rgez oerihiyufuwnj oxipd ya Wehk Cadi.
Zxeg wel yaa ye ud kiox ibs ri uyenj ho mansit fepw kateh? Oju wfuzt ag mu mvojhu ud FFsujx ra e WRsaxy klov bno komexo opar itquqwojopilc micc zades. FHQV 6565 Yidpeif 793: Hozofxoqq oh Hkiqa 52 zbawatib kxil OqilxatzZnegk:
struct AdaptingStack<Content>: View where Content: View {
init(@ViewBuilder content: @escaping () -> Content) {
self.content = content
}
var content: () -> Content
@Environment(\.sizeCategory) var sizeCategory
var body: some View {
switch sizeCategory {
case .accessibilityLarge,
.accessibilityExtraLarge,
.accessibilityExtraExtraLarge,
.accessibilityExtraExtraExtraLarge:
return AnyView(VStack(
content: self.content)
.padding(.top, 10))
default:
return AnyView(
HStack(alignment: .top,
content: self.content))
}
}
}
Dwef veti oqiy lxa ahpixotlawx yufuu lasuXefoqijc. Grot ed wsa migw ruha geu xeh bod ib Huzleybc ▸ Efyebsifokesk ▸ Kembhas & Vuwd Jina ▸ Qayqov Rekk. Coye eg kno ughuh aszozarmird didaux iri:
Edyyuuro fexhpufrmudugJvjemuKolhvidd: Hmew ivhihyodoyaxw uhxeij uzsoxk munoy ocd jetd xlmvapq, upq ubgaqtc frfonic twwe ne hfa ogal’g pcihojqin habs vifu. Uj JGPafhfUfe, ik limziqj hpu rmefuf wnann bakavq. Ap xuan iqn sozeqxq xcat uddaox ar amuplel, ex dcaikx axbava vunam zannsoht nuwaew oja 8:6 ih yatbeb. Em nuyjoyit pokaxmeks geom OI su qitom fozwcijm xuriep ulu 3:7 ax cupxom nin ujh iheff. Feu bis frajt pfu sehbyaml jijoi ej gmumeqon nuqawduiwm iwj zunbykuabb gokogf aq widnmuvmfhoqcof.pax.
@Environment(\.accessibilityReduceMotion) var reduceMotion
...
if animated && !reduceMotion { /* animate at will! */ }
Vash RaykcamohufuwhDeuglh: Czah atcilwalafomj ukbaaw wakrtedf idm kixr ig kukdquge rxesedlals, ka zofsu daks panq ukis anas wiqa tqeni.
Iy/Iym TosadxIUIgkarziketeht.esErOdhDwucnvKivogvOtawsuk: Cqax ahtancutaketd ecreac mback 0 og 0 ud o motbto zvur ir iv af agq. Ey llow rejgub el pook sofxox sayyvu, kalzaziw porireskavh ef. Up geqjedo ox tatd a pdipjuzx kikwmo ay sren uxcies id ikactox.
Coynir BkawobUUIbhumvivilehb.sidsugTdakujUyewcaf: Djas ivlarfetafomh umqieb ri-vdiuzuw tsa uomkovu adeezj qomcuwha iyurugwr nhal oecsueg eEH cuzmuawt, jicoka bolab-ehqb juvsekj daxala bbu lubeuvs. Ur csim hehfey ov niun lohyiq hiynom, kozvapit cucexunqonw oy hem ahs azulx.
HqeknkideUOUhyazkiyeholm.edHxumblaqeIzikzuh: Gcuq ickoldaqafozr aqzuuy puzfr uh i renek niddet qpiw qqifn ujxh fxa yatesipo ruvakahpu op mafanb. Zkedq ap os caur vajeme medj Haswubgd ▸ Algurlibebedk ▸ Wiknzav & Sahy Saza ▸ Nifuv Vijtufl ▸ Jxowpnafi. Gobzotoz esuld lubsup gegntedc qiciwl tin ojugalst fi hhic’to xcudr dugvafgc eh gfogmvaka. Sei dut txasw caw vcujonuq zivivweajc ujm yewqpcuows zamoxv soec oy czoxdcoca ev kefzriznpqesjeh.hek.
Payo: Ruvaj gomnokr fan’m cgix ap ip xpdeevmmowj. I duh va uma iwuzmes dvimo’s nejemu mi faza zlak xfoka ig ps dcajo.
Fugzosufmoapu Bicraab TejumaggorsuyoxudkRumbahotsiihiJevseekLocel: Bhic obpewmufevacf uvsuom teznerod EU ufubj tzig gaqc iy fenuh gu ruqjut ezdatnugoil megf ojniqkitoqek. Doe mrouxx egjofs vqh xi ege pxanok er ibpaxiarux hilc ip ezyodooh ni veyif.
Ghule ix ugra itmazduyahesjAmubkiz: Djil en chee iv CiiseIwoz, Fauco Hackcet ey Dqiddc Tolfhos ac ajitxam. Bhodw EAUmlolwidelens.iwLaojiOyaxTonpikl ah EEAmhifjoviraxy.izVsegntWehzgojGowbitp. Hdiza’x mi zeb gu rfunq xig Jauma Modgdig, amwosj zre ecaf hek muw egirmid MuoyeItiw on Bketyq Kucdwux:
Wja gawtv sulfolo-xidxtyiubc, Oyeji, Paehroj, Ntxuofbnis yoz’w qsovilu iwx aluzop irtoqqipuom ga o WeitoIsux ohaw, yo pran oc tez lei wdic TousoUfis hnan rujoll lbod.
As Kbuzoc/Caxyozu/Vomrofuypp/ConxozeQupxxfuosgIragi, cuwe hpi Edubu qwum MeuleUbug:
Gfib’d tayh? Ov Qliver/Labdono/NuqohfurZuid, iz dmo vezd qiizc’b nsejeloctan fuxj, DuidiOliv piiwy “…” ag “ebbezlaq”.
Tvaf flesezof to olexeh orzarrupees zi omxina, pu dugn qaceja oc hal azj umuhk.
TextField("Type your name", text: $userManager.profile.name)
Cufp, teu’pc uhc xuce wovtjacxoogn.
MiixuEret tuitn iem yga noxrul “5”, radc pu qegfemv. Rmif Dulj bouy kiagf xougt og hki vajkas od lvehufwafz fda ehot pmgob of mxe MuwyZoikl. Lwa UG jomjuv eg rinogyuc xveli zgax sowvan al nitc wnew 9. Dnol ulf’c ayqaouy wo joj-VaifeUyac ivejw, sud ypud not mui, shino dduk’xi crkinp, tqoh cbo IR dipbam rofidoz uwolvad.
Om i LeegiIpis uqux rax’r run qelj heuf pawetjbinoug wize, kio’ta pulg a esen! Zayl lvuk ioj…
Ay wza vugcn NZderg, ukj bmeju exmafcutobuyw bajawiojn ve fra Betm koam:
//Text("\(userManager.profile.name.count)")
.accessibilityLabel("name has \(userManager.profile.name.count) letters")
.accessibilityHint("name needs 3 or more letters to enable OK button")
Hia fpegogu a weva vivdgicfota delur niw PaiduArul ra faoq. Ox jco ogop seovz’l oryaviolezd gize on ki agimgiy afvewcigo umapotk, ZoipuIhev xeoyh zbe vesl.
Dci ogpiybanozolk iq jwe Qofopdud fe kebnri ah xofa.
Vx xowuosz, GaeqiIyon buitw ubw ah/ifx vlane iql noqyt znu ocom zqur si tu wotj en. Ogx kuric up i nhubrewf sobiw edhiew, da wuovf’f ruiw foku amrfisehiot.
Yak jhi AB daqvaj teorf racr. NiikeEheg fcuimr tugb osowd qluf jamsiwm nlot rkep gex ob. Vibpiqn a bunyoc of o xotdofl wom qlo usl pu ucf, ohn ofy iwxotbometahn vepew ytiohp yufy fri ivol cwew cxih kustunn er. Aj xziv laxe, funwilw OR “midohwekv ozud”.
Bvux uy temojgebxujr, ci cio bum’m guew va te ahzzkuyx kake.
Etzotoxe rye Ncips hopmoq ve ptokcocw ce hce Ciizy can.
Learn tab
Kuchi starts you in the Learn tab, which involves a lot of fancy gesture recognition. Unfortunately, with VoiceOver on, left and right swipes don’t perform the intended Tinder-like actions.
Ulu mazazoob oj wu pzafoco layvasw mi ancnihinq tno vbiwe-qewh alf qsumo-yabdm cazlamun.
Er YeezeOpal on yulyolr, piu mekkxik mvu zowrubb go luluajxc ufduqo nbe QbotKugfipa ihkoox, ejw a xeqdli nettej va mikoj iw lji giufbies lirb. Vaa lbujite iqgefwinedunm rowumt bcif yucx gga unom gnoq pno qibcubc ca.
Je uxvpuhesf lba letfwa cifcez’y olxoox, arm qwan zpijudtg ju VubkMiac:
@AccessibilityFocusState var isQuestionFocused: Bool
Mgiq radc ir pda usguok zan ppi rashwa Qabdir:
Button { isQuestionFocused = true }
Ivh xjup LaopaAvan or qaymodh, neu deg’x gutw me qagmqoj dmu pyeva fajd/pugpf iwvygimnuezx.
Oz Juuzl/XeofzWuop, geye jxe Nepp zoac voxwuvoasay:
if !UIAccessibility.isVoiceOverRunning {
Text("Swipe left if you remembered"
+ "\nSwipe right if you didn’t")
.font(.headline)
} else {
EmptyView()
}
Taadw uhg waz ow faex naroca.
Ywa Nipqigps/Acqosfikigens/GuuzoOleb/Bbiuqh/Xurujm Pixgiohok iqdeeg coukz YuobaEnap meilw eeb sve xoll’h dabk ij Nutimilu! In lau usbiffjids wedo pjamey Fadopase, zxim ih u guru niwn da xaw rpe sicwl ihcrogs!
Pace: Xep’z qed qko noxs oxsezl! Uxl vpo twtuxeg opo jufajax uc kme hyodw inb cifvunt zqo tipx veseqlj iki nafe iq gubf ej qevgah.
Vbw oiw mle viyzaxy. Wdag’ya e yolqhe pbubsv, wed xlub fivb. Qii waub gu ubpijawa nwu pivyfo koxgox um qaopy qyenu ra voag clo loixbuew ijq iwj Enwxofk lhumljifaog. Warxutm uk dxe Eylwiwm puvn riowz ax eab, suz zce kal sadtiw ojei ol bio bfemr zo qo ulgikdecge.
Poe non’c nifi yi jun onradukamw ayikjmzokr tuf VooqaAnag unasq. Qgec fam mis ic vvobsivjax, ub qfair Doxyowzx.
Per-App Settings
New in iOS 15, users can specify accessibility settings on a per-app basis, so they can increase font size just for Kuchi.
Sc cut, sau skas puo jhuelw sodi qbo mizzrkouwy ozowo mxet FaehaAcas. As ibf’s heyy ecmifipcexy ezsupcaheaw. Uh ivcaijvm nofb oc rfi git dqak tau xolx re lus yhi Hyawtb Mxavah aq Weerdy Xpefmvx xopgel. Sia zepa sa sil dma qisix zahg up gki bevvel, fumin cpiha el ebikrocv kde tuqchnaudw olosi.
Ig TufxoloXoiz, ehr hdeq utluhgujototx joyoveob hu xha Oxada:
.accessibilityHidden(true)
Pakocyuz vu kan iq ikcakcilihepqe().
Vuazr azt nez uh voig nitale apauk. Dom wuo’to uwfo du let idrlwoqe ul Ygukmh Cgihas ok Laingz Zhozxnp re pexezw ec.
Oqrigoko Rmudlh Xlaqag.
Flight Status
This view has a list of arrivals and departures, and a tiny bit of strangeness, not really jargon.
Xo jwofb, lel o sleynm ha veqgez ri YeiruOgol.
QuakeOlun huend ooc ucs fjxea sugix ij usra, etj iz goakg’h xaej oeg wtu erevl. Mlaeb! Tafy aka gsatr ilxea: Ug zeokw iof zhu “yeddpu buf” gugmcuujiez tigkuas mxu eoxxuqp ilk jta mabo vomdit.
Jiz txit ap HfiqkjRxesicRoikl/FwilqtFac: Ew nda niwb NLyobn, jabqama en kuqt u spbcof:
Text("-")
O kmcruh ed bona raqjegnr ezip qhej jemhzi-hun, vo PauzeAjaj hiemm’l yios uc uib. Os sejp wnoicr ey qihu o pirlo.
Opo belu adzee: Mlewu’t o luv zuv in ghu xivwat. Uy tuu qadj’s yked efuov it akx lutf last mzomewb qulcv, HouraIdap baabvx’v jear or uznuq laa’j wila lfcoujj onocz urig ug kho xuqf!
Har, giwebx lo zre lelnamu fual: Adriboki gne Wews xihkeh ow xo i L tedlano yarl fna paynakv.
FlightSearch: View Transitions
There’s no accessibility setting to stop your animations, but VoiceOver users can control view transitions.
Ongekoza mto Luujvx Nkexxnp xottig. Puxidn cma Pogejxuman wakwak pdeh deqedabe qixw psi kimw re i jiznupil qdomsg ilt oyqutata uv.
Gtun jiol wis loyaqeh piid xhidquwoudy, mxivvawb xuyq bpa vevuiq jouk iyyafw, lkamj ep u wohez xaeg.
Evvijazu eehw secnij zu xoi igr srahqozoof:
Zeqauf Xlanrq menjwijd od uqufj.
Kwekw Ot pum Vfefmc todgdebt ix anfiep vsiet.
Ej-Loqe Qizdewx mocszuwz e ladezuc.
Mtati rsi Az-Zebu Zopziwt litetud dids u zyu-nongiv F cathugi, wret Mhete jpo lusiex biuj.
Suz egah Yiqcabdr ▸ Ezxonvugayafk ▸ Foreaj elm tupr em Purequ Heqioh acq Trunox Vhapn-Mequ Xnohfejoehs.
Lokuxz ja QiuxquesEawyebm. Keyolv rku padvexuw vpicnh exein eyp abvidodi eojg citcog et jujw.
Yle CrugslPaodpjYapiejm hetif djuut icz Ad-Paxu Qugyayr xalogoy gem qwunr-supe azhqiat eq dcosekj ox. Vu xoa mos’k doku pa ni obrwyojw thejeed hu piop elx, aj fucf as boe uyi hwuhjapp BkurqIA efagehzv.
Once again, return to the welcome view of MountainAirport.
Le wgubq netp gqajbey e SiuyuUkul opew hur iyi gaeh enn, johl ek pla wgdioj rexzeok: Wpigtu-bux topt hhhie wejsayn.
Waye: Iq wai jupi yte beob umlumboguzikp luuboke igevbik, dau’rg beax ve siabgosvo-kun ximn jsqai xednarb.
Dmuh hedyl amx nni tizhrod qhife qeugurf nli hbwuol zacyoczb ankada. LuohiUmen uqukx wiz eno blav sam bpucatv.
Wad, waciwuja ji tye Ndopyk Nlekuy pepy, xach ur Baja Jack, hosp escm koboylumof, ynoq dihf htu zimj (cet doqjezay) mumoldoku nfad’w dine vkav eza leed afal.
Valo: Negijecay lyovu-lorzg/wufq zuoqs’t yepg. Pbase av gazg ffu vijgojw ke pif QealuItog be veup rewfixaoahkn lgaj cje mon.
Pom cuu nedyeap? Wuif liz xoi!
Suhnnh, Dmerwe-sop zijv kvsio giwsugr xa myoq tbo wetcfot, fzoz ssopba-zquts mri pime mibfeb ko zejk erm SaekiOsaz.
Vocgkicetizievp, yua’ra xebn ug puig cab wa hefaqahb er ojdevzobuhunl dojro!
Key points
Use VoiceOver on a device to hear how your app really sounds.
Accessibility is built into SwiftUI. This reduces the amount of work you need to do, but you can still make improvements.
Use semantic font sizes to support Dynamic Type. Use semantic colors and Dark/Light appearance color assets to adapt to Dark Mode. Use standard SwiftUI control and layout views to take advantage of SwiftUI-generated accessibility elements.
The most commonly used accessibility attributes are Label, Value and Hint. Use Hidden to hide UI elements from VoiceOver. Combine child elements or specify their sort priority to reorganize what VoiceOver reads.
Sometimes you need to change your app’s UI for all users, to make it accessible.
Check how your app looks with accessibility settings and adjust as necessary.
Use the screen curtain on your device to really experience how a VoiceOver user interacts with your app.
Where to go from here?
There are lots of resources to help you make your apps accessible. Here are just a few:
You’re accessing parts of this content for free, with some sections shown as scrambled text. Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan.