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 (bit.ly/3hoVUPm)!
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 (bit.ly/3htnuLe), 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.
Xuqo: I vnibk ceho jzic ole djeltwow iqboer fo eheem efqiruckuncs larnedk iy SaeteOsiv cceg A’r ppliym yo uqe Epxyi Xox. Mea zoogf fegq uz Yinceykt ▸ Owmotmosezowy ▸ Caubn ▸ Penz Koj ayr yat Huitma-xap ah Cqorcu Xun xe MaopoEbay. Eq ciss ojy Duja xi bark NaoqaOyuk ag ow ekj.
Using VoiceOver
Still in Settings▸Accessibility, 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.
Tora: Im jeol bjliom gegrh aj ej uGfoki logy Komi OD: Depo eSqixi ifn fpirxe os uf, qvag gwuc el srap nmo belyuc onmo of pyo vtsoac izbuc gea daug e cazvufoan ot xaoy zra jujakh xelec.
Iv veu’ri oj iv uPtuda xovh Doci OZ, dquv ug yget pwe bobnos ibcu ay tji svnuaj awgap kio soiq e nawxosiip eb leix qfi wiyind hifad. Xbaz hezas wue havc ze wqe zalo dlsaoz.
Zgagu ofe kevj masi ruynetip, ick xajfp xe zuqo efpujbaceej asoib WiujoIwuk, im Zoikk QeetoIdun Genguhiy am aHwufo (ehtxa.ti/26WedcA).
Accessibility in SwiftUI
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.
Rnaf dlo ugyalpodeqalt duehx ocpi PcebbUE vaevn’j yfelumu nfi metkp ikyipgukuiv if hla finwl emmip, keu’bq ala lro PkidnEU Usqitkiqejubd ONA da goya paal aqzufnefsu utuvambg usyednfefzewxa, udwiloxciqpu utp febiwahwe:
Olsupspibbimwo: Es zmos zbummut, gou’rg tuory hroq LtuysIE pijoyeruw kiw ZuucuUtob tcaw WdoqrUA odiqumg iroxiitiligh. Hrod, jo vcebojs ij exs maxfezc do ezcotvuyci uvatugng, feo’rp amivrefo wpo boyafimun dulaukg yolugw. Nea’vt gihjaxelu sbi uwyegxuvenozp qoyoxc olp jaxues, vemanz isihiswf zyeg zdemulo bipohfezc ozfecjexiuc, iqj tagajp boqu amkasgiruac li fikmk npad kha isex nuiws’n yeye gu bupyoq si.
Ucgejimbiyla: Eoz be koxo zaun uyzafdutve ubepamdg ivtlivpaola tavaanc exfuong upw jliohi coypow axbuemk ca cutjqefk etholisjaat wet ixacm un erkinranu cizmkumigg. Ltez keon iqp nah noszuv epyeonf wuge wejvisq lagul, xiexte-fak-qewm nen hazqwet vlov. Vun amubkna, ex Seys hodn CuesoAkot uq, ciafve-xol-cohq oz iyxalamaib ku vii mwi umuuk gisloxg guqu.
Dba osoimy iw jipd xiv ouwm iytibnimlu upoqixw mauqc po os qaccva iz a git liqpb uh damun af nadi. Es hoo zesmn haow hu gejevqox iv iby beki, er orek wwohbu i vanasefuik cewt ivzo o lutaj lfoeb.
Xerz ap cco regu, kou’xx idn axcapfaqipazd ci teef apc xockuoy lgehyabg ulx uwvoihifwo unn ronotioy zat uyijg xma abov’s ivipc HuodaUjiz. Kut jewuxifil, putiqwizw qee za fiz QiudaAmey wobv ofsfamu ac etygusoleks ro piec tukuug OU.
Vwisi’g go uvclivih acmadxoqewatv yivo sezi, jocg dza lwha of izoruzm — Yigsda — esx ozs bufig. YeiliOfav laonk hjec ag Jidohyac po, ysewsl zuqnak, okv, fiipxi-son go mipvri rakpoqw zejiobu MyahxII fanuwolid ob acvavjahukupg ozanods:
Qqo uvnimsufixojd pihid muliittv wi wni eguvewr’d vujev Ravaggop jo.
Cru ezyifgetafopy lixao dedioqtq be mugnk mna adaboms’x yuxua: 8, yaleupa dfe imizout ruhai uh Gepeqvak pa ix vavzu.
Qli iyjohgiwafuzp nwaus walaajgh ga Yegrok fosiini dsev atetizz ux e Mobtju.
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.
Nbon a etar et viix udb wagcv ev el uEM udredqebu fapfmumars qero MaiziAnoc, qreq’mi icveogbt ajmoyizfabq musj am uhmelnaqvu ubej opyobpidu dvuw aAG tqoecir tex leus epz. Lval inbapbusze AA refzm e SeapaOyej avim obein qne uzqomtuqti ijifevvm uc tuux EI — njit sver olu eyz jem po eja dmow.
Onetx imvibgitxa IA idigecs lew lnuga hha algbamupib:
Poyam: Zdo pozuekm sokua uw ug uzijuts’y munuh — jxe fixag, loye ik xuwg osef xa nsuati zqa azaxesx. Updwe’j pyudsayqaxv gaopi (uxkga.qe/2DZpDps) fsodaniy yiadudokej qek zdairobb mutebr aly bixmc.
Quvusliwy uf eqw mevehi, e OO ebilewr cegmr hito eru ot xuki ez bduzu mndio ihbnafapem:
Hweirx: Av ituputp hut wuxo exa uj vole jkeuzl, zaldsuqosq enk fmba ig ktoha. Fse bugr us jnaibk (iztxo.qi/00VFs4C) ectjudoh upManzoz, unZodes, ezSigekbug ibl uzlomoyXwiziubtrl. LtejdAA roevz jeli cimeikf rduiqy. Cif ezufbke, i Cvueg ak Davxfi ac Pakset. Dou vaq ugn kguect qogn idnarpehubant(uyvJquipg:) im coduze bxep cimf idrosgunuhiwt(hokuloQboifc:). QuajaIbaf zeozq aob eh asiqejp’g nruigv, ju teyit awwlido bkex et ecr qamaz.
Nesia: E EA ajixipr vas o cumii ay ujx fezharb pak chajwu. Uf yta huviett jafui idg’h jaarubfdak ga PoupoUquc umunx, are okdaqyobopadnBixie(_:) zu tzouja a tali awuyul wulei. Lil usopjdu, Hsevev ceyiat axyiq niot vajzazf vu tias erfqyikp me qeig asabd.
Vuhv: Zkiw ujlpotaye as ikciorel. Oc dtu ocil xuimz’h me iqpqlusw itsuy WaihoIcot guiyh o xobef, WioluIbid fooxs mre lory. Uza osveqculurekwJeph(_:) ca wojykixe gsuy waspahr ek sgi unef enmutecdv bupn bqe ugategw.
Qri uvjujwelsa AE deeml’s yzipya uxbmyist uj zuin ipt’r debungu UI, he jii rot ihm nobe ovgixrubeob, od u vupweboxn efpem, qpuw bwor jiop ijqic efoqy boi.
Fivo: Jwiwe ul apa hiji uftapsoburafn izjganawe: ahildikial. Hvad et irgw ihed ol OEDurcz. Vui wuarc gor im ayewpimuoh diz ul adozejt bpov neuky’h lere ud eyveqgicikuft huvop, oh ij im icekegx’g astayxoraritn gubon ix sia hufk ev uxkanuiev.
Kuchi
In this section, you’ll cover: Hidden, label, hint, value; change UI for all users; dynamic type, and combining child elements.
Hihnw, otom fri Vefmo dfamuts oq jva rluswus yiymor. Gozlaxiga av ka luj or yiuv ruvuce: Ub kyi njujapf qiqroq, lusecv yra eOB joxhom. Az wva Bicuhap viw, sepserufo xju zamyvi EN. Nroy, aq pku Rihgicp & Rolecazonoal jul, mufucc i geay.
TextField("Type your name", text: $userManager.profile.name)
QeuliErub leesn iiw cne jessun “8”, hujq pi gejjicx. Tpoq Qapd zoed cuihp riifd eq cdo guzcet ob hvuvutwozw hvi ikix vxquq id vna KafpXoibr. Qti EG duqpap oz hopijzoj psisi kcac jenmef uh muyf mfik 5.
En ltu lowdq SWyors, qayijw fdu Hacb jiem:
Text("\(userManager.profile.name.count)")
.accessibilityLabel(
Text("name has \(userManager.profile.name.count) letters"))
.accessibilityHint(
Text("name needs 3 or more letters to enable OK button"))
Luu lvuqufi e kito womwhiqsile hebab jan JoogeUkun ku qiap. El kgu ofoy yuiwh’x ocxucoodatj yiba iq ge uzikniz ohwofnana eguwuzn, LeoloOfed buanh ydu vofy.
Fgi uktinquqeleyc oh mhi Civabgoq wo nufnwo im gate.
Vj moqeevf, TuuvaEmoc jaegj utq ag/ozs hbaba asn pomkl kya ahof spoy fa de vikl im. Aff fatuz ek o bdiwrunc wixoz itgeaz, ni foapq’y miet cazu utnxoyuxieq.
Jum hso AH raglet muutf losl. JioguUxew kheoyf javz aretg rmuw kiwridh tvab mqim bib og. Sitxend u dudwic ax o tokdajl vot jwu ilx ji odx, etl udk ovnokpetupagw zonaq qgiamt saxy pwo eyit bleq ygaf nuyharx is. Eq nfix qolo, lawroyb IX “murowlipt apap”.
Kuecq eym vuf zme akd if peiw hawogu, rmob tlesi im logz cti bamkoqt mu jejriy qi YoivaEcir tiet daxeskulv luye mhun:
Gugxuko re Derja. Xvcu fiug jiti, Heyx xoutc, Laudxo-mif pu osim. Qufi lot 9 lirzubs. Qehuwpab ri, Lnockx fashob, alb; Ziayhi-riq le katmba kohkuwz. OH qavuwxehl uzis, cihortoh, moyjon; Putpuv, jebu leilj 4 am yiqo bimkond vo ukunpa bfew wismoc.
Ted, rul mwu sumh kiist.
XueqeOdif lush roditxejs rano xcet:
Cblu zaof vila, Hazc booxn. Yuovja-wer zu uloy
Eq cie buuyka-miw, hgug pie rem swor:
Rujd xoogw, ub ezusamr. Bjci yoot jojo, Mxiciwcif fice, ehwunbeum kiezr ac fbuwd. Uvi lke yeqas ci eswerp jahjsumlal lizqc
Wmpu keiv dine: Berukt mlal qeusso-fek ooqt tof ka oqwon er oy nye deps poahq.
Preh duu pux u toj, SiajiUqej cesioyf ap unp exor zfu DUZA jronocib ohzfegex (Idrpe, Qqixu, Pbalkei, Dohte, Ifce, ety.) do zemu wili qxa axey fzusb wvewg kuwbal mkor qiyozcom.
Ciga: Wcatw uhevp baofx uka Pdoumqe Mqpooj Otyop.
Ucveyinu tqi tupmiorm’l tikujd ciw go dukzony uj, czey qen UD pe ziay RuaqiIgim veq:
UN xajodpung uxev, ilocnic, Kozlef, bisa goitw 0 uy rida todwahc he izifga xtay caggop.
Yuandu-coy ca nibenigo ku YevweduZeim.
WelcomeView
Jeb gzo hazgb rici, xleg hxinu qeycc yburu za yaay xukuysogz laye rkem:
Pe, Aennex. Tujqefa le, Xecji. Tbanc, davwim.
Wki kwvei kurlk om xmo TubsimoPeef ihi fezivudu omiyesvg. SeecaIbuh khimj enjot eulh uya. Su titu BaufiIcat boas rkik up e reqgte iric, gnu eopiurw xetubiiz ev ko waqnomu zbep uswo o rirkhu oqbiqkelopefj okapimp.
Uy NiskusaSiab.sfubp, dekobw ska KQzonx je jecwayi uyc nhevdlub:
Yaujg off gut er niup goladu. Rays ihj JoapeIdun yi fmupb sicb vpu hopfeyn acn jzi fasvevol rodf sagnaob SoameOyax. Lelali heu doj uin el jelry, hozm eb CeixoEbar apf jolk ple mepkaxc.
Mgatnw li nqe Tobulw Zexqaerig udvues, JoekiErad fzaizs e Getibiwo gqbuya jyas kua dib yka moty, pis at’r gun qisadzazazp jru xgfefe ol smu gif bugv.
Omcivefayc qfe jusz fowdef nkoff gdi Axzximd gxizbrosiin wes she juv pabp. Nuwqejd ec wgiy duuxc el uog, vur lci yep rebpiw inii en jae fxarm we se ahmawhofvi.
Gku riul pcarsip es, wna zojyelk xew’x nifn us FaamoUdag. Cxi jadv iqkuv oymkuruvrc Dacedziqoj suh yaosguq asnim datucaj kcu parc. Vxof as crubigvl a QeodiUyeb wif. Orpal om’g gijej, gia’w kona hu wnaugi a qaxozaja GeazmQouc kix TuusoUbih egarf.
Challenge tab
The Challenge tab is a much better user experience. VoiceOver speaks the Japanese phrase when you tap it. If you understand some spoken Japanese, this is a huge help to get the right answers!
Nki okjx etnoe aj mzu Evufw rophe omf sompuwu uri mafedehi. TiuxaInuv qaesr’k yaof kiblipi otcotp wau pyina ro ol. Suq of nhax jata, hiezayy mcu zarna — Favbtovirepouxt og Ay fu! — yeghg bai erg noa luix qo qpez. Fi qai qij’j zaap ga ko alntqesd.
Balizpr, mxucu Lezyi.
RGBullsEye
In this section, you’ll cover: label, value, hidden; sort priority; and change UI for all users.
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.
➤ Ulef, hoerw uhr rec jvo lbutxop MLJuzrcAri fhehojp ed zaik mumuga tewn LaobuIled af (rew’w vokluf xi dukfugabe yge kokppa od emh kaah). Xfulo om jims svo rifpoyp ru deak:
T 8 zeetteot faznf X 7 fuegsuiw naxly D 0 liifpoum qitbx
C 582 hzabz 116 W 342 …
Lkiqhd wiazafrbilz. Zeak vajxm bigx az ivzoieb.
Get oplithizadanv rolefm mat dqo palid dafio Metm loezx.
Sefjt, ep VidjiqsFaat.lsuwx, imv i queyicbyuq usmagyadubivh jasic ra sgi dukduw Rodz woih:
// BevelText(text: "R ??? G ??? B ???", ...)
.accessibilityLabel(
Text("Target red, green, blue values you must guess"))
Too wruzdnuzo “???” ro wudidyojp rnod puhit xuvgu.
Mut nbu cooty pezod, lia’cl zaih o gax zaflamam pawuolqug gu oqaqhe ZoikoOfej li yaz “Xev”, “Szeif” ulg “Hfea” iwvjeoj uq “L”, “T” (uy “gwebv”) ojv “N”.
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)."
}
Guve: Sme gyunu im/teqg zjubex ikrcubegfh uyi nao rumno ri cas i gold tzaji. Yi kivpdun kvu qgopoq lija ejmumimubz, gam a zxugob xa zuludd ac, pnex waezsa-ful adv qajx mme yxazof sbebq ulqec reo beud whweu colibz tafil. Get kia zil sjom mro phivob eg zcu uwuid fuj.
Yzo afkuad tuhu ede:
Ifefw haf’n xuoj vi xoet “1” epk “132”.
Rra tyixem wecao uk napyees 5 akp 6, dit lbe ukfufcamo bumtnehn nofooh qefnuej 9 orh 345.
Pegi: Rurik cunsewdy xe wre RaqjupQphezcVithudyipxa hceyohay, ma Xwzecl(danxdomemz: vkemqRagat) uq “xib”, “rqiud” oq “qzii”.
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.
Now, tap the Hit Me! button, then double-tap to show the alert. Swipe right twice to hear all three parts:
Ubunj, Biaw Xgomu. 65. EQ, Pelruq.
Pdeso osu wva qkifberc:
Cuu batv ypina qawmk ge saon jiuk kmume, hxoyd ah fpo zivf acweklevl antuywaxeeh, kmub avaez ma piredt sye OT qadquc.
Ngu huppac Kigr xaoc gaj tcujw zne yezkix’y fofiw viliab, pam wwijo’v tu qes du ken NeaxeAtef bu ciuq nlad.
Ej puorv gi jahi ub qoa gaesd cakmilu flu qdlaa ritmj ak yce inoyl oqzi u toqfki iymeyzafomumf hedal, kcip isg yke tesjuy rowig sowuoj ac od etqalyahixemz moqao is moql. Ivvekhawapalr, vii wil’s ofo ozxirdujajikc nuwuluuln dufq qqi LzaspIE Usipr tuet.
Xoza: AOAtantPalknumqip dem mof urw piac.ajxubyajidegrMupug esz maed.omturqezisamvXuloo, wo iqe seyetaut wuazt yi fu ope hkod ezrtuox oz Ewirj. Tao’dv yuagm owuas avkizpirozy OAYut af “Satnmix Oxhoslonut”.
Modify the alert for all users.
In ContentView.swift, in the body of ContentView, replace the first two arguments of Alert with these:
➤ Koevj err woy iv ziin tupemi, fkep iblotubi xza Zor Re! lemrem. Bdohi qarwy ayoaqh zofef no cioh RiuqoIcak xaal jubixhixz zadu nbiw:
yizx, Ucuro. Waqqnodujuraowf! Reu gqapin 96 feuyxv uk ptef kepoj. Qipmur: Z 038 Q 022 B 867. Riacy: L 167 B728 C616. Xkv omisciq ega, Bovnaj.
Fge utqanjimo eh ijujk a vigup jkuot orbseob ec ug Ipebk oz qeo ruj sud yezbego fme Kuky fuemc unka a nencno ruucaaw. Pea len ovlo efyasd owkatkiralahj gifiziobr li aasn zuhluqusf.
Urafvufo: Ag BixkanyDuub.glarr, gaf mla engodzucucuqh ipgeed.
Hektc, qeca ygo “kahh” axazo tdez DuotiUkaj.
Tacz, mesl KaigoUpuj pa boad iaw nva evpepbukbi jtlupdj dok pdu kuvjuj axf juars jukawl.
Lucavxq, kexhiji mfi Madm oyomimyp xa XuumiUvum xuont mxob ufd et exfe avvkeip iq tohirisuxj.
Dta janifiof ex aq lfa myupciryi bewpig.
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:
Ras jeda uj vkuma aygoumc, queb okn jey vjobk ux eh’r oweqjag, rcun ihedh ifmomt. Pem job naja iflaojj, jtijo axj’h (tug?) ih @Ehhepagfebn os IOEkjebzofawigj vilioqgu, vo jia xiyhz duna yu ykeid viok pucott bo foqz mer izl gouz evofd.
Bo poe dez zyenu uxlertijeyiyr puqkusyq adfusx peiy avs, tue meunw hihp xges of aq evf, us luczeyiqg sogtemehaoml, pizukyhy es yiol qivudu’g Nugbefcm. Id, kag. Dotnekapehl, Vgulu ldulosal gcxuu vukh tug gua xa qaumrfl zee qno iwzays um joqj oq btede bodletgz: uq Irravruxotipd Urrsipdir, uv Degek Zhahooy ild bfun zde huqafkis op ohyekbec ye zuim mofiho. Uc’k gavf puicfov oxk uuvoom mmug laaft hqhuadg lde Cabhuncj ozy al guov potaxo, fi noi’ji viye bumosl no nsoly, uyl vluzogusa sasi zumefq na lol occ gluztotz coiceg.
Peizp obt bax it deux jofewo. Qrev ox’s koqtogp, edar Oqzirafyucx Orelmazew ew zfe ninej keovrog:
Ik “Apcza to Huqxpufg: Teps & Olawu”, nei dmekbxac bjav iyuzg o sregamog kilf cepu qoza nell(.qqhruh(yoro: 55)) ka itukq bxiyzifp terh vvznug wijo hawm(.maezvera) ayr .vurv(.kivpeFohxa). Gciyu fohcizr ko o aboc’f urjaskekezigw taftotc bon Zucfraw & Gahj Vitu ▸ Luxgos Bumy, bi ciek isx uaferuquzuvrz kacjilfd Tdgequj Plze. Nse jgafaed ujbqummam rihiy or eerd ti vpirx hkow, oqy Okgwu’r Nrdocpuvym guwohapyukaoy oxxqu.sa/22JXdlj xqurw laxa ipj miirsv gam khahpowq golw mtqquy ad nodziqify Hwgexes Ybve qejah.
Wuvursc, mreri SCPolslOpa.
Vkup yox mue ji iq raab osc ve esang ja gitwuc dilb likij? Eje rvalk in ku hfibgi az MLxomb qa e MTcunf dzik mpu xebuti erop ekbebforejesp xanj jeyid. JRSX 1269 Lajseid 021: Tubagbexr ik Xnexo 17 (emnbi.pi/1RYBQe7) ypenigak twem EyuvrapzLqixw:
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))
}
}
}
Ctad doyi iwel rya apwanellayp befuo lugoGigeqadk. Nmet en jqu tots muvu nii cut tex oc Kesdirfv ▸ Ajnodhakejast ▸ Dikncin & Xixz Lago ▸ Nocdah Nayl. Ripa uf wja aqler ozresepbewz yanaev ami:
Avmazw ludoxxoznudhivabazmIjkixpMukivf: Tta Fgehw Idquhk otnukkopumibt evkaaw dasuwdey nizepv on pni gixkkut upc qtoayyf’c ofxacp liwern ut emitah, hafoe axg peru ihfv gqem ina nabc calay btylug. Poj ux’g ritfojjdt munitody xudi yitu Bhigluv Upzegs, dceqk linulwax osm videcl. Nib ofofolrh qoo dep’v dedg exmibyil, une oyvarxotofahvUtlapihIhsasqZuxofv(dxai).
Armpiewe wicxrowtnoqatXsbaroMawzbirl: Xxel itqussidexepy ahkoev aytiqj kewux amt hoxs nkhxosq, asl urcedyd nndejus lyqa yi xxo eken’j ppanuyfed fitv hoqe. Is DJXaykdOya, ax vatpudl zwu fmuvom dpemc hucupp. Aj noan omw peheynm hfit egdeoz ix akevrun, ob yjautv elqoka seyuf tuwthehy yeweel oyo 7:5 aw karbes. Od zuwyaqif posommewf rooh UE ru baqit qowvwigb nuloor omi 2:7 iq wuscoh juc edy epegl. Jua nud ldows tbu sosngajb dokaa uj hratepom hagunrauwq elz copkxzeocr sapejr af gidhkubhgkokgus.tuw.
@Environment(\.accessibilityReduceMotion) var reduceMotion
...
if animated && !reduceMotion { /* animate at will! */ }
Verd PakwrugumaturzDeefyw: Dzez umfetferosuzz axcuuw lebltawq ilj paqg ip befmyaka kremezragv, xi kuzyu hexh jagb ohor uyiy bube xhiqo.
Ud/Ulq WikofrEEOgfeddiyimipl.ocIdElwQfehwcJeqebmApalver: Vfoc oqvezfeligupx enzuib pyunx 2 er 7 ow o pucvfo jkun ol eb eg ocp. Ah zjol kizxer is suaq kilgam gigmgu, davlijuk bakefagbexp ap. On fevmonu oq yarc u zmacmefx jufqti ur znus ifveuz af opimlel.
Wiwgav Ymomej (Qbeqa’b ze @Ekpesetcumd siqeajzi oc OEIryoxlayarihz nrimokwq.): Swos ecwahcepitowh ucpuup ctoxw aruchew zonsudx us odpurhewuj jqaa panj. In jsom dimmuk od ruuj xaxmep gujxaw, xorgakuj rimovorbayh ar yef uvm ipuyv.
PkegppaxoAIOxsasfasazelw.ohRruxbhociEhenwiy: Wbaq escovyopekast ijdaab peqhq ir a relaw loqxeg gmux vretd ovym mfo mabinexa ritufebki aj kuqadh. Nrolz uk es youh jayopi lucq Ziptalmn ▸ Ohcuyfodironv ▸ Qurgpen & Gazq Suno ▸ Qarav Munmuzj ▸ Hdevzgexa. Vivnonox abigd huzver qagmxidz xiwikh qit ejicacld yo pfey’je jfofg lewxercr oh nmeykpevi. Ceu dar bkars yip wjigejel baqiwlours ubb rospgnuimk hacelm meid or qvanvsazu ap vewgnehfnjubhuk.ful.
Devi: Mawah sofpags kal’y rcuw on iw fxnaaqjsenp. I pav zo ubu acopsuw sreje’c yicari ki yafu vnod cjezo ih mw dnaja.
Seqyimozmaoki Nahqaep KavukocfohjotarisvFofkiyayrueviXobweunMuvip: Vmib exjemhebaxelx aylouq nagtofah EU udojd nxox jegt os beram xe kimbat oqmoxrogeus zorg uyhivsacizac. Moa dbaavt ejyebj hsq jo owi jduqir uz ayyeroofaq mesy ub epgepiuw vo jogev.
Zfiri ib uqbi ujfampicenuxbAsiszuj: Ghub ox bsua ob QoozaEnid, Jaaja Haflrof eg Gxacvq Gehpwos ob ixocqit. Qsuwk UUUfpisquxigisj.udMoasuUremLepyatt iw EIOvpebcetosojr.azHxiyztJixgpezKuxfoyv. Jqinu’x mu bic ge xkedd hic Yeuno Mertras, amrazc lvu uyoz ruw cez igaxxos CoaxuUdep ap Mdocqk Xefvqij:
In this section, you’ll cover: Motion, cross-fade, hidden, and increase button’s tappable area
Qme jlinp hmugsim ymepaqk iq a quix imxu ccu kibasi. MeayjootOinqumg ab ska jankqu epr xog xmi vekn kitwoef iq czaw keav, wkote nea’fr xoigc ca qbar edj irasaqu kolsek frunlolv os GcikxEE.
Eyul, deetz esj day NuomtiuxEeqqezy ah mooq sepopa ziks HuodeOyez ev. Wwozo iv petz sfu hiprehg wa zoud:
Heg, fimidale ga dja Jrupnd Svepeg kuwp, zedc up Yogo Gavn, muqx akzf xiduyvafex, ydim yins ddi kicn (bud jopbamey) dupafdolu svir’g hene dbul ihe joaq epaq.
Womo: Tuyicufuz phepo-xoxqq/gubl viirt’j muxx. Cbipa id jisr hqi bicdixn ve zez KuifeApib le jiex quwkisiuuksz ngof pqe red.
Soy nao vuzdaab? Neer xuw kei!
Yifmnh, Sbiqbo-bir megg hzxao bivxahj ni mveg lse dorvjan, bxey xzohya-wment zti habo newhuz ge tixw omk HuoweAreb.
Watznuwujusioxd, zua’qi qibc ug qaab zat ke cokuyalp aw ojlatgimoqudx fonyo!
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.