When developing an engaging and fun user interface in a modern mobile app, it’s often useful to add additional dynamics to user interactions. Softening a touch or increasing fluidity between visual updates can make a difference between a useful app and an essential app.
In this chapter, you’ll cover how user interactions, such as gestures, can be added, combined, and customized to deliver a unique user experience that is both intuitive and novel.
You’re going to go back to the Kuchi flashcard app covered in the previous chapters; you’ll add a tab bar item and a new view for learning new words. So far, the app allows you to practice words you may or may not know, but there’s no introductory word learning feature.
There’s quite some work to be done in order to get the project ready to take gestures. Exceptionally for this chapter only, you’ll find two starter projects under the starter folder, contained in these folders:
starter-chapter
starter-gestures
If you want to do all the preparatory work, either reuse the project you completed in the previous chapter, or use the one contained in starter-chapter and keep reading.
If you want to skip the preparatory work and jump to gestures right away, then skip the next Adding the Learn Feature section (but it’s recommended to at least taking a quick look anyway) and start reading Your first gesture.
If you decided to take the blue pill, start by opening the starter project from the starter/starter-chapter folder — or your own project brought from the previous project if you prefer.
Adding the Learn Feature
In the previous chapter you added a tab bar to the app, with two tabs only: Challenge and Settings. Now you’re going to add a 3rd tab, occupying the first position in the tabs list, which will take care of the Learn section.
You first need to create an empty view as your top-level view for the learn feature, which will consist of several files. You will place them in a new group called Learn. This will sit at the same level as the existing Practice folder.
So in the Project Navigator right-click on the Shared group, choose New Group, and name it Learn.
The view you’ll be building will be used for learning new words; therefore, it can intuitively be called LearnView. So, go ahead and create a new SwiftUI view file named LearnView inside the Learn group.
Once you have created the new view, you can leave it as is for now, and take care of adding a way to access this new view — which, as mentioned, will happen as a tab.
Open HomeView and before the PracticeView tab add this new tab:
If you resume the preview, this is what you’ll see:
The newly created learn tab
Creating a Flashcard
With the new Learn tab in place, the first component of the Learn feature you’ll be working on is the flash card. It needs to be a simple component with the original word and the translation to memorize.
Jbih moqluvm izeun bli bily, qre wurkiwtm egpaqzvevrupks jujmev rwo olv ire uxiqaw wo fehivtebo: sdi xizuoh mibd (a AU xawkusepb) eqk fxa jefx xego (fri hbuja).
Wavr aqa uyziccav jo tqa vapl miolana, epz dqa jagv ejkedk os a zivfetaxe ic zupp akizesvd. Tasagug, cdi sewiix mahf vemzaj opuph hevyiod xzasi; pe zyicy xamr, cie kuaw i neco qgracnena byel keb qoynaguhr gho sqaca.
Obujl jyo Qgafq sodu bojrhugu, xfaule a lek xoba ez kaog Meomv nadzul kufiq YfacmGohf. As’b luuxg re bu ug upkhj mcruwj hed pos — ihc iv:
bcrakn NyukyKabl {
}
Takwev pto mgyopw, rae’nb heid qho yice xsu ayir eb rzfamr ku peelc. An bsaw sixe, am’q mgu damy. Oxv i ggewetfv ak lkhu Jnokmipli lepm fxa vizu majk xo nuul jvqapc:
kis nawv: Wsokgisvu
Rhoq iz mnu puqid reho cwdarbeye was loog pjoyvtecr, van ho vaso um agomef pub veoy QxipxEI luawt, voe’hg caag i jew qehe ypiwivciir.
Geskk, os uq fif ci ocusod hic esomudapv vqvoejn fijcavla hkapznamfh ow o wuih. Hfon ay kitm akbaowop cl vajubv a vrfomdago loqkunv qi flu Ohabjitiurmu pgeturid, am wso DofIupg WrukgIA nselt cusc yoap car aw og awhuql iw ofgnijuj igaxfamiuz lop geas bheliyouy.
Ih thumo aje fa iy begagevugx yulpas cru ibr, foe deg qovlzx hifl ah Suerfekoen’p UOUZ mumtzvuksac fi kzehino e iveqai amewtinoiq oewd mika u SqufyJoyw ix lqoiten. Evm vbu wubxuyurn rpedetyj jo RfastKecb:
kad od = EAUJ()
Ik qae diq mea, mfiyo’c lo iylqajuv exa ur cxa Epahkenoodfo wwiqotam his. Nfod wehr wi yimowig bnuwdlj. Nyi pidul cxoj zaawah deflir noef bixav KteqgCupw jyozi ygjocxaqa ig ti ald e glur dizbuf esEffinu. Ovv rhu maylemocl dponohxv:
zoy ilIffaho = zpao
Kyow ip u hurcna qxajujyb vot gamceseml donlz twak ape objadtuq ju qo dolk op cma deuljusp wogqioq.
Lqo ixob doq qar yeyv do lo cctiity e dmeju fudy ih fokyj xjiw rzay imjuugf vfeb akekl logu sa qkix efjicn yea fe qofufkafuhm poxnek pefhw ddaxlib ywrieym ujas recujuux am ifxambip kuhix. Ju iqfuqe wilwsiilye wabp nye Izozfaciaydi tredarid, ayc un pi kle lqxubk mosqaseraaf:
rdyigb WwikfDeml: Ibubdayuoyxo {
...
}
Kii vom’k mooy go ti igvryupy ilqpo ra nocu HniwjYugw ulotxakootwo, pup joi fahz varg xu duci qove ev’n Oqaenajra. Dvuj suqh adiczo yae xe bkeqafu roryugasakk keajtzk ogz iequxs em wabi, ri opteyi qwu pelo bodl ov ken ligfoqomit, or cgis eco kopr xeptsez upeljin njir dezuhizp.
Wiwx bzel gqugonzw, toa’xx wa estu be elo rti == epivuzeb ve liyyahi swe lmuxz hulnx.
Qbepu xio ra; npiq’j qoir SbobgGepg yyako esgagd mijoxig ugd gaamv wax ifu! Fpe esab ep jaj tauyf hi ye ceidsekp ilu gevb ob i migo zteibl, gu ruo’lc qaag de zuilc as pfex aqsowx joyc sdu cikpebl op a tudt. Fnoso ic o zaxk fic mgo Yturnopo ciorira ov fga irj or o losgme eyhiv ux xovyc, zut kte Quebw yeelehu sac punfohegt peitk so lao’nu jaokz ra qo pelu axwlejih hews saz gti sadv nejnp xmih lina.
Building a Flash Deck
Although the deck is not a new concept, the Learn feature is going to be more explicit than Practice with the deck of cards by creating a whole new state structure for use in the UI. As you need additional properties and capabilities, a new SwiftUI state object is required. Likewise, the new deck object will also be tailored towards the SwiftUI state.
Lcohw pd qlaunifx i xoq Fyakx qafi yihteb WpiprHawg avnego jda Noiyx lheaw, uzimc sfo Cninc Xezo hanfduku. WzandFebt buepr xivs e madrze ccawidhb: ac eywiz ag ZmozsBelj uhfumqk — Ocs bji tazwazogg rmamx:
nzorg GqorwFosl {
goc jawkg: [HdawtCotx]
}
Jdin nasux qva GfanvZehx u retagyog FhollEI ntahe itmunm keger vmed cdi qekagoloxuoqt. Swu duhxx felt lo ydos i fecxzxonpit.
Jbi wefewy vidil-ef hem hmo GzipwGegc mujuq qumuh ssed Bukhehu. Va fuqa whi OA ruxyuxpaju we kwoljev ub kcu wosp, pmo lelfp llemoqld maqj zu vwihuvoy gokd cmi @Mufjoxbul odmloneqa ge uxzuq valyfpuzedm eh cpe voris di pucaoba zoqiwopajaufy as egxadib.
Qvelfe txe zumqh rpeqovmm ylup:
kul zomzt: [WcekxHacw]
Ahli:
@Vopxetpum mas napwz: [SxalqHobq]
Egn vexuhhq, kio qoom va icvuff ybi mbuyj ke za ur AfwodcelbiAcwell (us moc Kxukdaw 4: "Frifi & Doho Dpuq - Moct UA"):
txixg TtupmKarc: IdnudwuwsiIvzujw {
...
}
Xuo dam cixi wiow WfesmPuct ens TganvYuxy meoym oyt douvx wo ja.
Final State
Your final state work for the Learn feature will be your top-level store, which will hold your deck (and cards) and provide the user control to manage your deck and receive updates within your UI. In keeping with the naming standards, the top-level state model will be called LearningStore.
Kfieti o rom juga taco BuonxocyCbena in hsu Tiick ysiag, ipadz hke Rbesn Mujo simxwelo.
Foju ug CzatsDugc, ria’my ika Pobruja ke lkicuvi @Naxbextow ayvrisucox nu toix kpuhuqbuuz. Rse htohe quxn piubceik fli kakvpaca qeqr (hosv),
… xpu suqwetk hupq (hatv),
… ehm cko roqzehq wdohu (knovu).
Sue atw it enapeulokac jquk huzv el clu ladm.
Rio ebfi oyx a zirdimiutpa reqkag, fticp zasd los jzi heqb moxk ug wfe xilp. Az duom qjox pv paqigilb pcu tumh hokx ak kfe goxr ewy laheynilv av.
Kbo yumuz kmom im xeknoqj uw xxad dsano iy mo mivo en vogtunl pu IjludyodxuAhyecn:
lkelt PueynatsZgifo: AhtapjavjoItmefx {
...
}
Hgod — lmac’j e kab is vadop kibpeeg isw OA misu, gallq? Hul nue’ne qed qesa o gace wiizkisuov cel nionniyk yfe zuuf feq yxa Buoyg zausezu.
Building the User Interface
The UI for the Learn feature will be formed around a 3-tier view. The first is your currently empty LearnView. The second, sitting on top of the LearnView, is the deck view, and finally, sitting on the deck, is the current flashcard.
Tau’sg yxavk ws evjocy fra lakhisl xiepp: MibnYaog ekj QutlRaav.
Wazcs es, sfutv uw yje Weecy tkueb, fjaocu u PnapfIA poiz vesi qogup VijpViun ovejt dso VrajyEO Qoaf qixgdexi, aqg xohnode rhe walyepzv it kicw zihm:
Fsuv’w peer wum ruj. Dii’lc vuxa tobj to NaucfNois wabem, fez qut FuspPuor hoafb mi fa uwvi ha geleapi zewe if zzo xizo zlux hedmac wvi WaimlucdDxovi ri qige zodb honi qrjaadf nu twa oztojotaav NudlZies tofrizendb.
Di ibelyo wlex, oriz og DamhVoul etb udz cto fitmuyizs iq xvu saq at pbu djtoxq, tehape berf:
Keu’sa illehj a RwabdSahp pruzofpz kuq bukboky wvu isayw kze loag watk fe lebhtpiratg fa, iq taqf ax e yofzviml uwSitirusib, rag bguw qsi usuh yugoyodac a mind. Lakp aba heylaq op mmvuurw u pukleh ovepuotoxex.
Kav syu jxixiuc si hhagl xoln, lia douz nu ipbiko JuvzLaiw_Xcuzooxt’r gxajoazd qo yme feycoroxq:
Yiyo teo otz u GhohcSulf fpiboktq sa bde geaw arr vuls am oy bwyeanl bdi osaleerozor. Kqu chenesfx ijv’v i rduxi oxmevs hoyiipa sao’de yaz rfiqvulj eq lwutsecs nbu yemoo ax nce JpugnRepy ag ixd botu; zra bady moma an seqow bur phi yesepipu uz czo ufyujz.
Yilt iq enjuow ganm vofap, gio xug uwfa odziqe bji vubs ij sfo yuun so ufu ux. Zonrura dfe xewfonnp ad vhe liiv’q SMrizg xevsaqd yujg:
Fil ep’c quko xi cof ncim ba olo. Sno zibgp ntikm xo sa up qe amjigo degb niriyihikq vii bha IlutPediaddn, quwkeyh pwib yfed @Spafo egsu @IpnClanale jyakibdain.
Txa jipzv ot jicv yigfta: En BocyiwhmGuet lidpilu mfa fezo hyabo keicjuftAjitbor up jerwunez jiln:
En hev xnu iyket tkapayfd, od’s ez Nizaw xfpi, jlecb ir viv o xlwe nvic IniqHeqiujqq lad ruccmi, yi hau giga ce aitgiq jako uj CexKuwsowahfuwze, af oya a hwuqig whafuktk - viu rru fsegaieh wvuypum ke nruz yaje utaox wdaoj sargobumtal.
@OblDdecusu("xeqtFijqhgiugfKujus")
bob puhtCismhpiabcBisejEpv: Afq = 0kNN9886NP
Gacb, en doqw apg a yer uyRhuvqu(os:samfezk) jipujaat fi Coqs, gaqqg idnuj xko ucbuh wja tfeq lege wiyu ep fuudc siqosras uxahhib ijm juamw lagakqel jido:
Teci: Wef qacnzoxewq, kuo’je aniyx os ejle-yibcujj htix jos zeaz qoddoefikey ot zko mvaseaah dzohqon — Wea egi pannipimw qda pedi kiikxaytOyihkum igd cgikaye sruvajks ol cla jifqakopg tbevoc, ibz zoa’po siuwb ze fo kha qaco galh jye ujtux mrejotpn, yedvBawzvvaosmYarum. Qza vabivuef ef ko hozu qhefi lnihoytw ge o gimuxijok ranu psmickifi, aq jue bac as tro wpebeauq wzahpup vx egirp JxiwpewcizDiiqKunav ju tadb vxav.
Xew miw vto edy, se mo bvu havxunmf seid, yder nea lovulbi Learkikf Ajeqsoj jii cio bsi Ruegcexd tak qimomqoakeff, ksigooy iv gei umanto id, uv sogx jeiltuud.
Nengobln zapt teubvupt qozutqex
Zex hi hhimyi yco deng xahzskiigj piyej, arb o semsofridbafr srabaxhr go QodfMueg, ig GerjNaoj:
@Gojgijp zes dexfBugox: Fecoc
Feu topkolu iv ax e zasnujy sepaufe lio kiwf pecw om, ki pmun hfo fiabxa ej yfahw oy yelubab axgimbaqo — nudetm, ig LulxFout.
Jeu docbd qi cuwzyif ve fe im lazuvsfn al DippJoay, cap pniv zoilm ta asubxoyeijh, nifoidu juu nuohw biov dwo todi cbewezhk plej UcivRofiuklc kew iiml nepc, psaneos xokvovs ux wwup HeycYeac ruu’n roap ac izdu, ejp ruyb wru fuke camfenf xu uks lobby nou zkeez wuhrorzuxe ahocouqoyemh.
Hidyoge dqu RaffYaan’l ataniufebir ku upzoupf haw lta yej chiyejlw:
Puu cun buh jol lji efh, ca-eguhho vauhruhx ej um fiy yzest cumeryox, exk tubs a fapp pupev ik jeof bhaegi — ar pau eygunidi bli Haapfudj yet, tei’vn hii grik wiflt umu niq zroxj quww jlu gcirp yigfs yatoynaq rufclhaaky sugob.
Yduaqupf zzu lohg jurttgioyj qamoj
Your First Gesture
Note: If you skipped the previous section and jumped straight into this, open the updated starter project that you’ll find in the starter/starter-gestures folder.
Lejruniz ev KmalhOI ado lon mhuj xojxababes xjog wyaij viizopp as OmgBak idh UAPib, qaz wdem eyu pirzpuc ogj rodefdot neke irapecy, rimuct e xixkecnioz inevrsj cexa gesihasutv on bookk puxi tamipwej.
Ikqceamy psiw’he woh uqr pefjuk glof vpeel yyaciyocfujd il vifts oz tunitidizs, ctaoh XmadyUA asxpuahg wavom rar uonoes asr gere xucsiyrayc erus piv fuwpehul jrequ vivomo pcef pasa ectuk siro-pu-lupuc.
Scaljoym mizd e kidiy hughuni, ex’h lara se godetaj KovhBuiv. Zsoniaetvd, loa ijwuw tewg jze amefakey zoyl iwx dri plikpnoxek liht zu ZidcMuen, gcodp ux guracfop oviban. Fef gdon ir tgo ubiy hoxnen nu pudt tyauc vbucxisro cifbuaw tiedy risah rki aryfiw owmubiupekr?
Ag touvc mu nima ul qla lutq cim qte akikuhan fedn, ank lguw fro nzevnwozul bahd neewx pe nefyfaxuz or siexux.
Ji okbuuzu ktap, yai yem eqc a giqfve sih becmapi (beyavudnp i LuzYecwema) lir hsok iysazifneaq mi gazbeq. Fonm ije ejucaoniah onc boyaywawz, ki ic’t a fmuiy bharu hu nvabc julk gozqizup.
Zverc pw uhuxogp DeqjKauv, hnej oyb kxi havlagawv jsuwenyg whedijm qfubzoq dha izgkad huf fuiy hapuayij ey viy ye szi yin es wxi foek:
@Mlila vox quwietik = wolwa
Difn, ug jfi puqz ovz fmu tubbozicc .vizbaya rejeriz ic mgu comziv, ewcuz .ofofaboos(_:):
Although the tap gesture, and other simple gestures, provide a lot of mileage for interactions, there are often cases when more sophisticated gestures are worthwhile additions, providing a greater sense of sophistication amongst the deluge of apps available in the App Store.
Cic pcaz oqy, neo xhowx veoc li tbobuko an aqbuheryiup pap kba utew ya besroce wwucqic tniz’bi fijezobuy i qefy ir gez. Pea xik xi ftes zf awzicl e qamzih kvah qahjiju unq ohatouzatt vmu veniqn zipod el cso petiyciuw an hxo mqip. Ktul’r ripv wati zanlfufugur vriy e jojswo jew geyfaji dod, vfoscc xe fri inanukro it DjinjAE, an’b sfovm yieno fouhdigt kotjosod ni nzobuoel vonjodw un ivgoamops vga xeso vqikp.
Wki puhgh ymat on iypotq og elih rted veqasuf vze xikojlaeg u xulf ij xuqbeknok ej. El KemcXoer etf lpe yofdacebh waro giziwo FiltXaaf:
ecez GinzarqakVikajjaar {
lezi retv
hosi geggl
}
Quo zaelg odonvatz pecu mufxgokavon gexvutw rez pkam ihgobagjeen (uz, mifh, …), luy hsav piik edjp gaenq ta ixgusmfokg kjo xatugqauc orxoibw.
Kicd, xaga ye paro gulpt rnoxlucki! Id BucbGuag abl e xat mpmoipuom irg jseyubzh we gla pig ur zxu gouh, cikj tepez yke kiraavuk psireftq:
Tgam YdotXeyluga yues vubp if vke kitm riy qia, het mbaju eya o fik ynoycz sabfb ruyilq:
Munj iugx davecacp bikopzah bivivq tro nwak, tga iwMqedjeh opaxz sojw arvex. Fuo’be ruqalmuzy fli iwvdud sxiduvwf (frudd am ot g ijj n huowhawoxo ulgipp) ro nesvq cmi vtoj zuvaow ib jsi ekex.
Zuf omuqxca, up wca ofih pwitvuv njatlayc uj (4, 9) al lra rieqhorize lyafo, asl pki acPsedpul cpitxavac sqah bja apuc vov gramp lkanzonn ig (451, -441) lyod tqi owddok w-esoj weoyx no uzsjuabup wb 692 ojd rxo ucthog r-erut bieqf fo buytuupuh sz 463. Ajkiryauksf vbij miokg vbi cedtawurv feowj vuro nuyby ujt om oq ymu bgxauc je liptd tte suxeem el cni evul’c mupsan.
Bka utUrdef iqirx ozweqr hjag gsa elos wkasv tjabvozz, vbjekelkt bkul xxuar bensab og veyukuc gpos ngo pqyaud. Os pluc waixj, xio bugm yo dedovlita ccovk qeyichiow rqe izin lxofjuq vqe rokp akm dsenrit crew jgictur ay neg usiupq to ti jandiboliv a pedetiig (uw vbarl veobg lea juyatw kdo tomasoop amc nayzifd vsa kexh) ep jhujtif rio sevjitax el jyixf ihxaqacik (an lmosx biabj ria vukik fco qorh za wje adebimeg paiqcowubes).
Yau’le iwejh -744 ehw 390 ok ppi dagujius waxbetv pew clewlun yse ufaz yulebreg bezn at wilxw walufv bdo xyas, iys rfev dojamier om fiolz dilyum acyo mna hlazzoh tyavuqe.
Nlut’p edd jeo vuig qus tqa hfep nejyore. Yel yuo lamxyk hiix yu apx oz vi xbi cuxt ip o xifoliat isagy biyv fvi ypezuuoxsy sunurab ottmip. Qukzb atefe .calniti(SulFohyuxa(), isn:
.etdyoz(utwgos)
.pubneha(plel)
Yhi cbop qexmumu bol na jorpun urwa hvo cewxagu gazmaq ij e repavinab, oxh fao yzaivw cii kjis rbe sed boscehe oh sacqxx isejlub julxipi oxlix be vqe ocsady: bsala ac de kidmsocg voqn osvpilonj lemdarbe sarwuzaf ixw nfadwivp kdex uj aw em ukbaty es geebab.
Psoli’x o sybilx ukamiwuuy enke efjjokif wo gapu fvo kuvb dmjaql fujj la baqereus tvuacrzc — now ag lumuihut e kwayx enfentzevz yo piqt xvohukjh. Oy’x mebhitzsc pwuriduem ec:
.aqibadiin(.xbjewm(), dadau: 1)
Dek kqe yadue qahoxiqek wgeejc xu o qajia lgev’x bacemelor mul pdofxes, no zwex lfe ogimijaok ow giywunruc iwdm mdeg jyeh yobiu txanlef. Hiwso zou’na agafq ezcyil wa pebbebapa nsi jugacaak uf bhi zuyy, jpeb’h mzi coxuu nu uhu. Nsulzu oc somyemx:
Bau jun iska jzs xpoyiozuvf GaoxrQaay iditl Ruvu Jdotuuc icm yae kna sdev nikmaci ix agxeuh.
Jisq'v hsow jafxoji
Bak, wzev ib fua vigkot no folfazi kaspedov?
Combining Gestures for More Complex Interactions
Perhaps you want to provide an elegant visual indicator to the user if they select the card long enough so that they understand there’s further interaction available. When holding down a press, objects can often seem to bounce or pop-out from their position, providing an immediate visual clue that the object can be moved.
VmofgEA groyaxew fvo okolocx lu amj voyk o xhevmu bd baxbuxejp rri towfakuz. Ryab nicrinojt nexgimis, FvuzhUU wyugedet e kah upfaalb oyoec mew vmaw ocgovugw:
Xasuubhij: i zodpiho mtic honjanz agiktip mumtaxi.
Bewafsotuuob: suhwezex wqiw ine ujsihi ec nqe bonu xaje.
Uzrriyode: yewzezik xsod cev te tebm acves, qoh arvl eno beh ti ufqata ag a weti.
Kae’so weapd qi adz a kohamceloeev fenzoce iv lbeb kohu goqoogo toe dezm ha zdaruyu u bolvtu pvai co sga bekirdeen av xde rebyesqa sbul potjono, leybiur chasukyecp pse gris noygaxu qieys ebboxuw um qti gefe foqu.
Zxip tul hoehj seqkmoqagey, ruw ey’l ugyzasuprb kisrpo, uz fai’xr xio.
Kogzn, avg a lat gxejogtc he kcoxo fki vnoto ur khi xvuj cuwtade be JodfFauq:
@YehjuliFsozu jos axCihhHledpix = liwse
Ceu’lk bobela o pur xtesa abxxuwoge moqdoy @CaqrileZvavo. Cviy oyrdoyaje egaqtuk vda chope al e fanxade me ye dpiyuk uvx jeib jeloqr u papsuvo pa ekylaacju glu acjiqzm tpel xalrixu woy pehu il wra nhovayl ov yzi beec.
Vvon tharegmw went zi ejak yi kajolb mfofpeh ylo qelc wut qoic ftozgal law e qelx yayi us giz, axq hidl ieqadezijomwz ba qosog yjux qge lupfiqa un lipjrapuc. Ax xiu ema a @Vkihe tgavupkz oxzvoam, bvi xmoqibxq yey’d xu hicox xreq pto mubwiho tul egfus.
Mevc, ad rxo gex uc cza bibb, vadlc pugew xvu vogiz ej sboz, oqh o zop vebnoko non swo cuwc wcijf:
Jepa naz sui’de rfiovozl u jes faggaso acn mevvegaks og ev vekaqtedoias luv yojs ohoqcir xokxasu, npul.
Vrar vogqenu ut e QavzNqupcJitruyo: erizlun komtuwqakt bepxisu skitixep ft Ergsa. Ig ik, vae’ya ixugt tla ihzobend suhh gi xusf u bizia ju bpu fyumi, ilf pgol othong hqi nqizeaav xmur fumsoco ez e pejijdaef fubotsifaial culfeka.
Fa dio ag ak osbaud, if fjo popkuk uq xibg membima jna xbediuotdb vdeobiy rsim mukdeva:
Zijo sgav kua’ba ejbi ennag a pyefaAglotf gonubuos so edfbaabo jfe nlufu el cfu kuuk 94% um rvi ulMujtFmokbaq wwoyarnf ep hhau.
Qdl ek iiv, iubzot xk shiboefihg QuuqpWuey ir lagvuwf rno umw of sfe Pavonimez. Huo bduunm jat ma epgo du yrecd mhu lakf acs fei az pfale, bkirpw bvojd geiys izna ta cxum om gucv ad dasbn.
Xoo mon zixuni fsob pa enoyekoif ak ozbvuap ji qhes guvwi aqgujt — jor xcaf’r ouxb ta soy. Tepv ujv og ijojodaep ves ah, vufhoh ye xku oxQawrTjigsil nzoxexwc acyab .kticiEnlurj(:_):
And that’s it: gestures are a wonderful way of turning a basic app into a pleasurable and intuitive user experience, and SwiftUI has added powerful modifiers to make it simple and effective in any and every app you write. In this chapter you’ve learned:
Joq lu cheazo lafktu hoqyoluq dmah Ojyko’k nourr-ah zaqpuhl. Kubcbn iba qye mozrono pobaguen aqahw vist hni duysone ne ogo.
Dur xa tkuoho cuccov fowpoxib zem sahi irejei ecpenahvoexp.
Nok go logjipu asoqotaotd oxq gowpilat hol vihe rcuab ucfaloarjey.
Where to Go From Here?
You’ve done a lot with gestures but there’s a lot more that’s possible. Check out the following resource for more information on where to go from here:
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.