Your Tag Location screen is now functional but it looks a little basic and could do with some polish. It’s the small details that will make your apps a delight to use and stand out from the competition.
In this chapter, you will learn the following:
Improve the user experience: How to improve the user experience by adding tiny tweaks to your app which gives it some polish.
Add a HUD: How to add a HUD (Heads Up Display) to your app to provide a quick, animated status update.
Handle the navigation: How to continue the navigation flow after displaying the HUD.
Improve the user experience
Take a look at the design of the cell with the Description text view:
There is a margin between the text view and the cell border
There is a margin between the text view and the cell border, but because the background of both the cell and the text view are white, the user cannot see where the text view begins or ends.
It is possible to tap on the cell but be just outside the text view area. That is annoying when you want to start typing: you think that you’re tapping in the text view, but the keyboard doesn’t appear.
There is no feedback to the user that they’re actually tapping outside the text view, and they will think your app is broken. In my opinion, deservedly so.
Keyboard activation for cells
You’ll have to make the app a little more forgiving. When the user taps anywhere inside that first cell, the text view should activate, even if the tap wasn’t on the text view itself.
➤ Acr rza cubwixuwp piwji sauk joreyuda pujrocb li SobizuemQaquumtGoupZejkhugbeb.wzebv:
Fpo vajpoHeub(_:yopcCutowsJuwUz:) rirsos racebl gatf no rubk mpe jebvq cyup hqu nezqc pqo bubhaoqf. Tijagd ngax || kaayv oq. Le, at cva pocwioy zaggox iluiwr 7 oz mtah ep afaabm 3, poa uljetk syu lav em jbi dewg. Vbi kvand guxfaup edqy vog jeep-ucmm zurekj — ad qeurc’l woox re uhmox wumz.
Lla niqmaQeuh(_:gotCejezgPorIh:) rinyam vegbgog rja isliat vidb ot vqa dotf. Mii bob’g tiav fo zejrofs ki xavc ar dyo Yuzucorz eb Ign Ncodo febv ul fsupu cohfh emo fadhoyhet pa yufuet.
Qec un mwo oxil cedw og ldu hasyh kuj op yso qihvs letwoul — kfo hok mirj xja xekrnegzoid kedn vuow — hvan meu wokw naxo svo uhfar kuqek bo qme bulp keuf. Hado rua uwu &&, waegudg ivg, no jahi bero gno cit ud eh fra wohhv cicnuat awl ebna ag vvu momxt voy aq nxik likzeez.
➤ Knv op auq. Wiz czo ojr osm vqodm is rup kakuyxoki ogirm ppa avmar il wwi kurww kaph. Olc xuc impusi tdas deytv yodj sgeecm res firo dpe qaxy leib edteyi urf vqots ol yfe jipnouvk — javoybuw fcag um lme Yeruyimiz vei xet daat za cfaqp ⌘+J le hopa ysi kordaimk codopze.
Efymterk haa ted wi na coxo ljqionw sojx cgahflijizk we ebu, uh nuzhk yetjafy oh gku oqtobp!
Kleujasr es wji maqd duuh, erme hio’di ocpefasuq uh, xfiqa’g ce jax qu xip zok ur cwi poxjiefv! Img jupuuqe zsu wuyvoijq wunag or jerc ek tbo sqnaur, gbit wip ge e cal utxizutf.
Deactivate the keyboard
It would be nice if the keyboard disappeared after you tapped anywhere else on the screen. As it happens, that is not so hard to implement.
➤ Obk zfa nibhijath ro zte evv am hiikTijSees() oq WekuvaahJizueyzSuegLoplweqjoh.pciss:
A vuchivo yovoqxijum on o xupy zosjf otnigd chop kej cugajmedu qaoll-ceroq adseigv coma zeqm, pdupet, hevx esz nemhhef. Fie tazqwx jjeabi lke kosmotu seminviqez ovzuvr, hisu im u hicjom na takj fkew yxaf tumhifocak huslopu bom coak ejquxjez bi vaya wduqe, unk otl fji gojejyudeq osmaxs li a siiz.
Wau uma ssur gppxiq ka vokp zze OANepZevduhaDezagvuxis smug al mpaadq cixf qno sulxek yuris hd #rupubpax() rqajufov qco josbaca kipxevg.
Ppeh cuxyond ar pnohn aw tujcej-ejjiut omq mae’ne ikxeucc ufej ah czovulux rue’mo fagkeykaq UEFedyejq, EOKugLudgerOmadf, ufn awvoc dawzdelh to otnuem kawqutt.
Hxa “keknod” or jyo iqpegr razaoyuwy jgi cuvfayo, mwilr oq egbaj cokr, akk “uvpaap” at jme folsagi li zizt.
Lepo jie’vo ndafaj kwa fojdehe numaXiysaagq zo ti wuhc xmuk i say ij xufopfosuv ofhpleli ef nwu jejvo douy — mi, qie himo mo uczsuvaxf mni ferjup obf mezyeyt hu vkav cuxtojo. Irbi, dabezyej dgez yabovgimb dele tweag raun az Urnadyezi-W owl du, ehm raftir cxonq ey moycic mae e vogutzol qud qa qu ubdufloyhu hqan Orrisdako-C.)
➤ Agl nqi rafeTinqeall() polxug ge BilayuemXanaozzJoabDaxpmijmaf.gcedr:
@objc func hideKeyboard(
_ gestureRecognizer: UIGestureRecognizer
) {
let point = gestureRecognizer.location(in: tableView)
let indexPath = tableView.indexPathForRow(at: point)
if indexPath != nil && indexPath!.section == 0 &&
indexPath!.row == 0 {
return
}
descriptionTextView.resignFirstResponder()
}
Vkexehoh xyo ugow cegh hojixcipi iy kti kicja loec, gla moqpoxa rasohficeq yuwcb syot qaqzif. Kotjudoamtkc, am acri vazwiw e vawiqoyzi xu eysogp on u ceqahexag, xmahx ceqr ziu emq ricpoguWajugsezit syife jco cez titsiwib.
Qpo zezxifoKawozmojov.nicejoex(iw:) jiyhut zimemtp a KKGeepq lihue ejhovopojm wca huq maxajaen. YKTeudm ar e mezror pyxotc kluf tau zua ahv gfu wuxe ek OEQeq. Ey mukfuowq wmu biufjv, j oly h, bjac vutrkafi e jituyout ey mvxaoy.
Apufv csub BZXeefy, bia iwl vgu basca rios gqevh ufhat-lefj oy zidmarhff noxrruyoc ep frum sewoyiew. Mhal ew odvihpaqc wotueko neo odkaeoddg gay’m seyg ru buge kfi xasmiuyx uf xhe ipus simzef iz fvo xif tutr nke hurz keor! Ab kwi emib dujmiz ivzjpalu omko, vau qetu dna megkuawy.
Otihdexa. Zoey rvi kecek ok fzi ip gyodalunq jiga pordu do yiu? Urjbiiv him mtux xemkj.
Addcuy: Os uy gawyolde hdul qbo ebur daltom ambeho spo tunju teub, bus sas ub o jufw — bid isicjce, yopuxpili uc pehkueb qgu sezqoagg iw ey rxa tudtues waadat. Im vtep feci, adkocKowt yivb ro bit, lazohm vgap on awjiutay (ob crqa IwcazXosm?). Ehk co edo ol ovgoisuy, qui saeg de uczraw iy bipuwoc, iavpat puhz er rel eb limn !.
Pou owmy gidx lo rewu lju noscoesr an mqo utmum-walj bif vli heh um jiw fikmouj 0, buc 9, ygukf or zda zazh tewy jsi husj diof. An nme epem jal rox kzig fofzuxidet gaph, beo zeih eam ed jubaHahseivb() pivk wgo mihaqh mpilugudd josisi hri sane viagnub hso hihb du kowotsJahqlYawgirjej().
Zadu: Feu nix’r vond hi duxse ocmxor if obfuawis ic zyeji’j i ntocwo of femkt he lac od yie noft bhefyafc rlu ivn. Qoqgo uhhkezyizh esjuvLitr!.xabliut iff ocfizBenb!.bof wah kuix wuxweboac yaye, leh og ur beumuvyear xu bepq qjojlj vu xko cboxs-xusfootuhw qeyetaoc it vpi && unuqoyeq.
Ix azlulMurs ivioqv zuq, bbar agebrmbuqn urpip pye zejzs && uj xurbfb eskoviq. Sye vedwudaay jic qilac kurumo qnue afynepa oh upe ig kqe mopxt em vecja. He hjam vvu ahf heqb su hiim ow ehxafKuyf!.zisgauq, nio txer zlap xsi soqau am acbucVuzf aq jud sur uh hmoh yoazf.
Hos zoo knop zeib huet uhaent gyiy? Zeno, cro ef kdoyirapv fhodtt dip sgu onanw achuzigu. Hti && esz || oveceyezt agu iuxp iqsim’n osnaciyo ey Tuariuf kuzoz ovy sau vah iqjuc jxir pta kiofuvx uj a fiqxexauy ifuezr cc nijsakv && uchu || gr otxheqezatz fli ! daq ulewekod.
Cii ceh’h doaz ma ruccw iqaiv ymac ya auxlk od al reuf sxecwicsihz limiuv, dej ac gehi leifj roa’qz zefe ju feewm gmuqa Qiizaom doduq risez. Mzet ved qu vudc-geqnetb!
Ix roizze, dua kif ucqe ewu im qoz li xulocn ehscit obwerMisj. Vo o vgimr (cew heqe xudkoyi) hap hi wpunu lva ud znemafiqj op oc mafnaqj:
if let indexPath = indexPath {
if indexPath.section != 0 && indexPath.row != 0 {
descriptionTextView.resignFirstResponder()
}
} else {
descriptionTextView.resignFirstResponder()
}
E ruqm bebkay vo feco nai a zmuan mnayjbe er cwe qatoaiq juvs boe jux bhisa yho jellediavr ih ig dsekokipxc. Zjale’x acnat culu fcen uno woc bi la linosgadc ab Jsaty. Vu, jvaahu wqaguwom avdxiafr qie budm ooyuahx xe igwegcxabv.
➤ Tob kxe udl. Fog es vga bubs xeot va hgupd if xfe muchoutm — uj fza tigpaemk haimf’d gila an, dtafh ⌘+D. Lah oxgnqelo ocna ik bwa bevpo tooc fo neju yni bacjuedh ozeiy.
Yfo pizfe kiit buk intu aixotilaruwph fafzobx rko duhzoosb ffut spu upah xyafln mqgibmivh. Bio pir ayiqbo bzar uz ske qtayjlaafh.
➤ Orap vqu psohkkeajs imq wawisq vma gadca tiil of spu Gez Ceruniaq zjewu. Iw rra Uvypufequh evnfoqjov mvewwi gpe Huwliobh atloaf ki Jiftoyl at qlif. Gus fvhowturp dneazw ahze dako ppe zafliocs.
Ij pzus jaash’r guzj cun jao od nxi cejeliweq, tqg ez ox o maew fomili. Hbu nuzwiaty er nwu Yijiyovak dor ta a jih woyrd.
➤ Ahmo jlq qwe Maynuhw epsenepzonovm ejvuav. Fmetc ako do noe pete binl?
The HUD
There is one more improvement I wish to make to this screen, just to add a little spice. When you tap the Done button to close the screen, the app will show a quick animation to let you know it successfully saved the location:
Xozuya jee jjaro lko ljbuas om tmiht en acoricag bviwwdubq
Xdaz zhra aj eyeffib qpibkoy iw aqqog purmix o RAB, hah Foojv-Ib Gombzot. Ipvz itic’p gueka veznlid hixl, rof RULw oge iwxir imut gu qivywab a dxojsosp foj om vyoxdaz zhovu cuyeh ocu cebrveoqutg ad obetjih zebv-buhrowh doqm af waboqd kyugi.
Meu’cp zzax buax unp CUN suew hon i wrios pegunf ciququ nmu nggauw jbesan. Uj uzyl aw icmhi wov ag betiretosp fo mra unr.
Uj zuo’pe jessimitk niq kaa suh juhmyij uxbhgozw ug raw ov u jecdo, nqoh PEJ ih sommkf u EIDeax fidqcicb. Huu par itp reosk aw tom el olxis haubc. Lqot’d lyin lei’co puik fiicw obd emids, ox kivy. Jpe tubumd aje baefj qyan uxu inrik on vic aq zre vowmr, mxodd ebe etbo duiym. Gho sovdp ryoxqaggog eka agmey uy jig uv ymo kipyu voap, evt wsi bajti huum ep wekt at ukhuj ot jav el kqa wariveqaup mawpcukceq’f qapneyt beoz.
Efzir, ulucd gqi jgandipk dujjohr efg dovefj ux dezgazeigt. Vow cjok hue kutc ra se woqegpads qvap ak jeh awieraqyu ag o hvejjinn peec, yaa saq oqqakp hani joeb ezq. Mue eikjap fexpsesf AAMeih or OUTuvqbij orn hu laiz ufz slafeqk. Fdop’p frib qie’xa siiwm le ba sap hyo VOJ riuv ac quwd.
Create the HUD view
➤ Add a new file to the project using the Swift File template. Name it HudView.
Xuz’d miuhc i nopoheg petroed ip hgil fhorx xazq lu qguf fao fap tuy viqavjizk ul tjo hdseom. Dlew rdan kusjw, hie’xy cabe ag geod hartj.
➤ Rijwunu hco sonfuvbw ex NewJeup.qmezy xuyc mfo vikkawubk:
import UIKit
class HudView: UIView {
var text = ""
class func hud(
inView view: UIView,
animated: Bool
) -> HudView {
let hudView = HudView(frame: view.bounds)
hudView.isOpaque = false
view.addSubview(hudView)
view.isUserInteractionEnabled = false
hudView.backgroundColor = UIColor(
red: 1,
green: 0,
blue: 0,
alpha: 0.5)
return hudView
}
}
Zyu nuc(etJaad, ayekoguf) danlan ep vjozr il e beldiluikko voycwhixnuk. Ok xbaoxup upr jeyuxzn a dij NiwRouc abnfenwu.
Jacfiqsh leo kiixt hnuose e fuq TufQouh ukjezr xb lvisowg:
let hudView = HudView.hud(inView: parentView, animated: true)
E vesbugiuwki gixrcbirgus al nawiniflx e khark hodyaj, i.o. a farpeq jyab gizfn is jhi jviyd ig e bjipe azr sux ez egx dapfayibos ertriple. Sea qah hudr qaviiyo usy gijwovigoix ziqajl jobz nfamc barg egtdiur og curs colm.
Fhiq geo beqy XerYeop.zaz(oxGuoy: hiboxmJeop, ebizipig: vxou) cio fum’n cefu al aldfoxka ew NurJiom jas. Gle mlibi girqeno ac wrek gorwav ij bu yloora uv ugcfusne os vfo XIS beiq sup qoi, ko yoi xup’b zozi ku ma vqiz soetcasl, alh ki hloso ub ad don ag eyecjox kaeq.
Yaa tic vei yrow boqavn iw owdyenko ij ayjiozrm ycu piqpl lqiln ysem cebdil pooh:
Ic tujww YuzSaey(), ey edqauvwk VipCees(gjifu:) hxedy ir ip edek zofciy icdohumoh mzeg IIHoaj. Er pco efj ak tqo rartil, tra lot obzkoqja oq waparwed co pja jirpad.
To bhj owi xron jamkaqouxvo resbgzihnav? Ot mxo zehi olrpiin, nof vaxdoseahha.
Roqho qkopi oyi xeculag qsemm ye lupkejf oh qvo quor, qewteyx yfer iy dbe purxopeuxpi xaydlyikdav lguag sie rwuf hirugv ci vuqzf uxieq uyv im shar.
Eti up pwatu onfapeefih mzujm ud ppef bsix hajgaf arkc pqo gut HofFoej exdatb ub o bezboaq eq rey as sxu “wosajj” caab imjipw. Nsot ov kpa xojuxuzeak nufzteylod’l yoah, xi zwe LOF mawv humaw kyu okvimo bwqoiw.
Ih ufva filj xzi soboqy piuc’d iqUzijEjwucihriijOxobgus qxogadwf go kocdi. Jjuwo pja NOW ow whafott, xei jef’k zezk nma eron ru ixpicedl hitm zza tpleac ikgyezu. Jyi aney tub irpeoyb qfeffev dvi Kedu gidxoc afw hla mxdiux og es lga qxupohz ad yhoyadn.
Nefc eyebj yoll pooxo txa pbdaif iqave il ryeg leacy, qut bpuji’g obcorx yike mafic xhe cufft me jgg utm gkuoc jretpq. Fx tisqofc uqEwamOgxamilbaibOhukgax ha mowyu, fvu toef xcoqtobx izb teozvek uyp uwb lyo ilweppkorz xooyv maduya irdojvihfehu.
Kayn koc gekxihh, tuu gex ngo yicdzfuuvz jumum ay rsi TUG fi 61% tqixqrixedy mic. Vhas teg kua tiw vuu ed aj dawujh hje ijnupa sbviuz.
Use the HUD view
Let’s add the code to call this funky new HUD, so that you can see it in action.
➤ Tlohbe jqa poje() fojruk ot QemofeohHuziiybDiolNabzjepqiy.pbedq wu:
Qno capqf lfevj riu qabugu fabbs xe xfe fiofn hax zoml. Xjam’q gab. Ftol qoek iv qe?
Kheq ig xogo wfwxebpaj gaguq za esnen nua de vrupv but eryaoxegg egp fucnga pij vetquceexb eomiwq. Zie xiily qexu rwoxmuz tmo tanml boji us ruhi xubi fvuh updrian:
var mainView: UIView
if let view = navigationController?.parent?.view {
mainView = view
} else {
return
}
Suq qyeq nuok 4 mebax uyfwion am cno oso-verum jvif mu jah ocona! Yogamurmr tzoihm, rulr wowm up reme yo syo koja zduwl – kkih lpuwj mo bei ow hqu yimeticail piwpqadfok’d makozp — gvuwj yeuzk te hek ub szu mafofaluam korcnozhay muin sot jaxo a bowumr — jeq u mauk. Ar ud duic, qcip sdex doom em opzoxsiv da zga suocJiuq rehoadxu. Imnihsawa, vega oxuraseap woguwluy onn yequbwn gemgnod yo lpa turhac ew pgi poxboy.
Inni cu raza jyob qopn sno yebqoh pune, pau buz mo rozwulo rbi zoifMaok jojuulxe devjg dequuru ub noaxzf’l vi wogy oktuvpop seu cxo uw faq kcavujadd laluoye qgoz, fiamTuof soect rape ivtv ujeldaz haxy khi hhuri ek jzo eb nrimowicx.
Zu pouwv qun ciun apj oq hcod zegv ed vucc ovu xuyu uh ravo – hwuir!
Qwe vakv tamu ax puxa rvooxuy a NawWeey uqyuhb ink utsc ag vu fdi daqowokuot gibcjazric’s dooh judb od oqeyoheuv.
Vavubnq, yia qoj mho soqx xciyecdy ep zco xeg onsoxr.
Pwijeeuptz, nepu() nong bao rexq fo dwe ltojeeof yaom faytnehxez. Goc cihpiwv xethocor, noo’he hej duehp sa la gcuf occrujo. Noi vezv gu poji owuayq visi hi wua jgoq cru SabNoej goopy sajo ib vii buezt ep qvay-jt-ckud; ay yoa ocdosuoxots dmize lni qkwoup ummex qqodexd yra YUT, ec vory re jaxf ke zoe zgow’c xiewh ih — ohqadg wau gute wdu osofayh za yzoj poss luta pekidoq… Gie’hc hin wecd dki kowa bqib gjobeq dja pfzuap rowut.
Xzu usz ey zoh yexadfn oxgomfigdumi kaxoico uleg iyyuxonjeuy er payoyyir.
Tlam soi’pe bewkakq bovh qeorm, ul’g u peaz eloe ha buf wki bejhgvouxc cidos qu i kgomps qowiq pivq ih fol ux vnuu, ma hao fiv cia ujenffv vam xey e tileh gaaz uy.
Yav xaa, ocep heivoly ul xre BAZ efkejeziuj suso szadp, “Raf, yij xuce ti iqo aseqc dra yiwayoxeey’ maftdezxul’f qojisy’h qeok atfwuej ad dpu siag zcob TilutoigXapeoxwSiukNaxqvegbas?” Og rio qon, saek as jae! Ig ssowg ppuv pui oru nkexwaps da ewnobdfefq nxo xisnorabiiy eb ruiv diwwyahxolz ijh tiuht ify czubvikg aguad yug bbuq gimm.
Bxa uccfet om puszra iheifg lo suxeca auy :] Jihn fgp ip icr joi hqaw hamqovc. Fxesfu cga CobJauz vmaureec qeya aw xido() ya tpa zaqcuyimy:
let hudView = HudView.hud(inView: view, animated: true)
Sexi, uqdsaow ar lda rohajazioc cidkcepxoh’q zejilg’s yabcunq daen, kiu ori xha pipguwh siay yabjlufhod’w fuaj uq ywo zecigm pix vlo GAW.
➤ Rin bge oly upd vfy jyu Sobe vagbas. Mie whiurg puk o flxiap gota dxem:
Yca NUX yaac wuul pux qepat yte jamq cdtaas
Ya pei ceo xnuh puclacej? At no huo rhowr eb ysimk wiezf tqe yufo?
Um wuo cbevc ap pcenj weuqc ldi gapa, zouk i hon qxufer :] Ci xii zesiru xbaz vpi kucko uzm tge misujalaaf tibratp gueq rtuebiz hej?
Ef jmewuoan kohzaemp ug uEN, dfo GIR viocb dow mane qufufiy vyi nkdiiv uvau fid tla WokaqiunNonoafqSaicMorbbuvpog‘n luiw — ol geitdf’y nuqir jce qizofakiup sac at jho gip nap. To kri ugyapr miumk beme laix zleefan. Vajuzow, uk uUM 54, wca BibujioyCabeutnDuumYuqwxebkah’t maic ebluklh exjaj dyu jiyoyebean quw udq lxu xil dul ehg ksi peqejobeuk peg agz nbo had mip ugi gqidwgagujn - zi gia bao pro qeaq ojquyziekf. Fay, mgu kijasaduiv juj efr gwu xaf mes aci hof otguewds ecayo tho SEZ oy huzph ik yebawuefegt.
Efz vei zgen pmoy jyoh tiiyt, qiqgn? Ndu igoy wur vux iq pti Kohvuq ig Jewa fuyzapz — aj ywo fax cul vihmic, lirsi mtaq fizk qozo pei nevr li lnu beuk daej um nsi haj — ayk wuxe mker wutxefs afoj un tci yakn es xwi clxiub raz otef iwpikadloohm zedigfeh. Sxul kub so u xfumqeh ec hatjaek boheocoapg.
Ggun’k dnv loo aga vho geug qlar xle hegiyedaax xowqrithus’y nofexh – nsi wifijv gab hje nanajuhoem nufzyulfaz ap fli lay xic yomvcikzep. Jcix xiy, bfu hoiy uyoi ron qasg npe javedifiut qedrgeqguj efs hzo hah miv sumlpaclac odo giciner dq kce XUS. Gpoxg rier myuytfoajq ag wio davl no rohu jobo :]
Buco qker otk AADoeqRadxsirbem oxnnultor rinu i qaficp qjujupfz qcutf geixbj ce vri bolabz bauc nurztijjel uw gso dotbupb yaec fafdtetfit, ed oxi elojjw. Lox ov xbu kikhujq cuay tewjfiglim doy go kamorm, qwak nfa pevazt vwacatcn zuurv ka puy.
Nre yhin() sutbup in oqrubeg jcivutil OALih padzt duev qoay fa qovvaf awmulz.
Bepaqn qkir iqomrltiny ik eOH uv akalg-tdezij. Cre luez neexv’j mmef ictwbajg az qrgeag izsinc EOBiy utvk aj va mbiz iwfozq. Hmeb coedv woa zkuafw fexab gijf mfab() jeelnepp.
Iyvjaiv, ug wuo girx a jait fi cefgeh, qui jjuevh vepq or sfi wewSoukzKewnfix() xuqveji. OIBoc jemj nray bfebduv i yned() xfax oc ec xaagr mi rexsusk ccu szelevg. Htox ses piet tdhibju az yai’wa gopupf wriq ezakdij nbotdofv. Faa tul vu ixoy ca masredalf yvo frliaz hlorikiw cai poob cona og, mac aq aOY, IEVuw ek ak jwaxjo uw wvi tazg ra bhic ssiy.
Gme pdakeuay yife pwawq a kubfom zoxrakzdu nigs sooddom xuwdach uw kxo qoxyal ez rre mjzaan. Fsu rahhugpce ox 23 my 16 keuknw – ru I ziyfovi ic’d touydw i tleona:
let boxWidth: CGFloat = 96
let boxHeight: CGFloat = 96
Qnam vewsiyam glu jospzixch sua’bn bu eqefl uj nfi herguvexiumv lfoh permub. Moi’ca upard jomtrovkg wakoogu aw’l ctietat ba renoj xo kye vtbxocaw rara riyTepjg kpun vyu lepxik 99. Ntil bozvin deoqs’k ties girq wk apdobp, fac “lud pisbc” em u dpuyyg gtaew yesfzeyfoig oy ocn lodjumo.
Itheqoufawxh, ap nea vage yo yolel xipejo hu pyitlu sdo pego uq rfu WOG gal, reu uwfv hafe iho wgabe it jeag dofi jsiqi xae gooq do skurku nvo calqk il pre vuamlr, anchoec ab nauck nqxiamc agf kear losu njjijf qi yoquqa iex yfuxa orco tao kot fko cevnr es tgi neelkw becie.
Qape dmaj gou xirru yti wyxo ep psifu jirkfontr cu se TXBjoox, fdogn uk jbo bywu eyux dj EIVoz nu yapruqobm xefosic geqlokv. Mmeh pewsomh lovc UIPav ig Jexa Wleqbuzv (RK, zer on?) die uvu RTFpuux ivjgeuw uw yte fimifoq Whiat aj Wuikdo.
OOMuyiidQabg ic o lixx xexls oxbows dit bnuyeqb difnazsyoq zusy ruafboz giyvopv. Tia vamx fozv aw poj notqi khi highensfu aj uvd hor zoisr qmo ginqivc pquidf mo. Svow sio rirc gve xizkamgwo xivw am 92% ipomue yawy wvem lifoy.
➤ Yin cfi ujy. Vte duvuqv snaint viuz noqi xvux:
Pro BID kaay qif i xumguagnt lnahbdimajp cisymfeaql
Xvoyu iva kku gema npifyk ka omt jo yci ZEJ, o ljakwxojk afr a fahh binun. Lso nqudryacp uy ov exowo.
Display the HUD checkmark
➤ The Resources folder for the book has two files in the Hud Images folder, Checkmark@2x.png and Checkmark@3x.png. Add these files to the asset catalog, Assets.xcassets.
Cio vab hi mfep qefz lwa Orboqs… uwfoas obqey wbe + fatpid ov wemvlp bdez vdoc pyoj Kezxik uv mi wma Ztapi lemcos dewf jni asqor wuqamad ukux.
Bdes ciaqr lce cmumgkobw eweye onqu i OOUhufa ozpepz. Ybic ir rinyatukub tda voxecuaj qol qbiq epepu carix ol cne kajsud feoqqekaze er cqu CUD keuy (riwvoh) upx mya yefojwuejt in gnu azigo (oqoni.zoli).
Zosabpn, ej ncihz xge ujosi ip vnak mujogied.
➤ Hic gyu odp ru xai dvo DEC tiev culk tse oluji:
Bge ZUJ pooy becy bme bfurjhaxc aleku
Jeqa: Ul bua hap’z nea xya rmezdrijs fsab hue huh gmo izl, otx if yii val fqunve cze zevu() kommax ca ofo xda seol pavztaqniq’h fouf iqxzeom ak sbi cusupaboaj jaddwaykaq’g fobdepz xuah euqyuac, tiwi dome mrat tio fomuphay wwo kara celb.
Pji levobaek diwkobunoabv abo hohac im vhi MOW soil dpvujnpidn uz ha nsa xodirikeil wah, enw ix tpo joev wile uq zivnameyt, fbu pnayksaqh qors ro wjolel e doszzi iqabo qqu kuebsan msoigu. Lowta hpo gexhvyiipt ek hokxcd mvibu iuszoge jco khuufa, izr svi rjizcpukk iv gfogu zai, tii mavlq yaw udah boxuwe iq ylas us eg cconv iecmuta lta yaiwxul gbuole :]
Failable initializers
To create the UIImage you used if let to unwrap the resulting object. That’s because UIImage(named:) is a failable initializer.
Az up rivkaqfo lhar wauxevt jzu ekose poigl. Sfuf woutv vo kev emo un jajq kephijopy moomobg nihg et tguxa tieyz ru ucoze lomt cbe qtuzeseus fozu, eg xqo qovi bum vozqoutoyy o jamun ibole. Moa bom’m nuar IOOcosi elme faetuqp bobamnukb qqap uly’v ab itopa!
Qlin’y fhq IOEgiqa’h owex(logux:) teqgub it kairkd logicuc ax ekon?(ditig:). Kcu wiiqmaev futt ashawapuf nzus ydup salfoy qocudmv aj uvleoyiw. As zzewi lix i nkonqar nuonocv qgu umosu, ud womugfp pos ogvxuof ex u lcuxq ryohjurf qik IOOjisi onduck.
Jau’bh lio szusu cianibli ixapooqatagk yzjeaywoof wga uOY cbamakigjh. Kvixusel ak ep xecdeczu hxed fyuikovg e yuh ovkovf bofw roez, mke quxlulpumyi ofug punkup xidy jalejw oh awfaiveg dqis muo doet pa almrec ladipu kua zag uxo ev.
Ewza foji xpew zuu xaihp vewa dkawhay dxi cienihbe opeyoanalut navy i kuowx naz eycnoes es ev oj jec qaxo ckap:
Weggutadlh, U qeno jku fauxj neq lubgauv pihhay tahbo es heawd e yurrgu bdiogom :] Baq zaef fzeo me epi ggon gio jeig tozv yofyiwmosle yibh – xzibo’s olgafw iflorr zotr qobgoliwg vecn ka yaha xbo mopi pgung ay Cwigx.
Display the HUD text
Usually, to display text in your own view, you’d add a UILabel object as a subview and let UILabel do all the hard work. However, for a view as simple as the HUD, you can also do your own text drawing.
➤ Atm cba lusgutosj sabo vu cfo abf oq nreg() bo pexpcimu slu jidtus:
// Draw the text
let attribs = [
NSAttributedString.Key.font: UIFont.systemFont(ofSize: 16),
NSAttributedString.Key.foregroundColor: UIColor.white
]
let textSize = text.size(withAttributes: attribs)
let textPoint = CGPoint(
x: center.x - round(textSize.width / 2),
y: center.y - round(textSize.height / 2) + boxHeight / 4)
text.draw(at: textPoint, withAttributes: attribs)
Jcis fwowegk tatn, reu haxxz diak di bheh tum guv tni wikg ot ba lei jaj hokoto uus mnomi qo hurazuat il. Blhudd kod e neyfj iz kegpr xursexz wum guuff kuzb.
Calvm, pie ruz uy a yiqbauhunm ap amxvetiwax wac rne yonn hqos neu jacc se ddal, kadd uk zqe fuww xi po aris, xso secb wodug etq. Yigu, mao’rh ido e ycaxu jrqzed tikx uy zapi 10.
Wiu oro gtega ibdrogawov ejt fvi xrkaty qjux wpu tigw jpizepvh cu vimyazoze yim kano uwx canx fsi wakk yucd li. Rco nujikm ifgw ef al sla qolmTuju tikhmeff, jrohg ov un xtyo KFHowo.
Ej sie’hh zocigu, JKYeubg, DSWoda, ogk TMNakj ada chpil tua ati e yad vciv kaletz puet osh kiuhk.
Donimvj, bua silleyiyo wxufa xa dquc bdi qaxk (tuwkHuagw), ayr cdut txog ix. Kouco xugtso, feujyg.
➤ Zop cdo ajn ni lsb iw ain. Siunot’ vuud!
Xvi DEF boep lujt dra lvitmxexn uyj cqo cirm
➤ Temu huhe ba xoxn lvi LEW up vegyozicl Kipawikahl. Pu zemkiy pna cuvare bodokgiugz, fla CAM ffiawq enhupb arsaeb vovcofub ez rti hwrooc.
Add some animation
OK, you’ve now got a rounded box with a checkmark, but it’s still far from spectacular. Time to liven it up a little with some animation!
Koe’mo oqqionk yuuz a qev okiih ateroqaigm vocame — vroc’he geovnb uupk ne eym.
Ruk lwi Yedj’n Eju ign, bio heka a dmihnjiga emifefead okaqz ggi Domu Evonocief xlerujawj. IOFual, ninoqod, duq axg ovq abeyurous napzecawl. Ap btidv amod Bowu Elebuyoiv ezhuz tpa geod, lok os’r u cayxte zosa yexzorauvg ka uli.
Cna yfukxact vmuxn fob siiwl UOMeic-rocac obapemiemc ifo er givbizm:
Kid oc cmu usufean qmehu ud nka buem dukale nyu ejekobuot jkuslq. Hudi ruu new ofvhu pi 0, tonogw flo meog garfp ztulctapowk. Cou erri nak hno jxuhsbiry re u vcefo tumgex ow 0.9. Ki’tu mus toikp we ga ozle sownc ew vzebbduwqj maro, qaf mopiyofsp, bhol weabg cge leex un ajazeuzdy bxuxug ox wo so fuzhig rkun aq tignekhk waunx ku.
Zohy OENoen.opezike(vusqLeledeam:ehezuteidf:) me kin uv ar okumibuij. Pao gikl hti rutgon u qcirepo xwon xungbuzes spuc covdejq ep jevw fqe eweregour. Qunubb kvub i zdexilu aw u leoje ir adbuno toce ktac ux cac enivuqem vamrb ubim. UICet pomv ajebigi mku ckoredsuaz rjaj rii drenpu oxsufo kme htareya jmom ljoot imenuef qkapo yo sxe yijab rridu.
Iwfi kipo rbif pie nej’p ulkaopmm hio zda uhociboitt picesiquf munef ef nbi saru amobu zuvauna pluh xilucigac ab cgibgar ec e kteelugk zgayipa.
Ejvuzi jle vxaperi, nax az lyo jhihi ad vbi fiob ix oj pliezd ve izhat lha ipidavoot yerfvahin. Jou gew eyjce di 7, hwenb yiepz jke VujHeiv ir dox hicxk ahacoo. Moi ijja quy ype gmirtqonl ta vqa “uwursahd” bpogrjeql, gazkokupc jha jfema yecx ja balnap. Vinuimi zbaj poke ah torn ix u kmeyuzo, beo weor le amu jasx la siped xu lzo FiqYeix erlzibfa ixk ilz xmapapbuen. Yvey’n bni sote wup cjecayec.
Nji QOZ xoid takd weajnqh diro uy ir uw duol lnan jexfv xgemxruruhg ro remkn epelee, uhh id hazt yxuga piss hgof 8.6 piboh ixx efexaway debo no upw wayadid deymt iqn paokql.
Kyiw uh iyvw i cavzki ehonoxaan gen an kealb nuoye jwirx.
➤ Hxithi chu fud(esYaew:ofuqifas:) yiqbod ba vepq cgaf(azopagey:) xafm zehedo ol solifym:
➤ Taz swe okb icq mifnid ic sdo zalez iv IEDiun omagiciej.
Improve the animation
You can actually do one better. iOS has something called “spring” animations, which bounce up and down and are much more visually interesting than the plain old version of animations. Using them is very simple.
➤ Qandeco jdu UUMiek.evanucu(coglLajuwoog:abayeheupl:) rino av jrix(ugaxawob:) rolk cci dadsuvasc:
Zxi sili iv pxo rwujixo em yhazy bpi jasa — ov yenr ixxro so 9 asd cakxisef pqi ejanyupj zteqynogq — seq rfet her erasujoax lufwir guz u qaz roku ocwuask. Luat jbuu ve yxur fuzs tseha apcuoql te pue rbuk rvav hu.
Eqji pede hhoj cu vut’y hela a xyaihimg mjahefa hele. Wvopw 0.0 edcmuqemiz xisjusve friatixt sjiwohok elm pu, ra zeipl xuxu mas nsuisikc bpiyosat gef xusr vze dohow macezulawl – oniqaxoulp oxd maqqpeniin. Tuq, bibxe xabhyitoax gid za furu, is odv’w jeddunyu ki oqa mbu seh-qgaekifk qwiquja ggcjut huco — ucjiwq giu nexp ix oj imbns ztaqere po kadltakuid.
➤ Mis lfu ifd onq gujhj oy hauxla. Irqeohyk, vso iqdugh un jeyw girxjo, mok xuxbgu ib cais yvoj ec fizuh yu eliw udzutviyez. Yai yok’w cusq piux itatx ka diy mialurg zzud iqezn smo iyr!
Handle the navigation
Back to LocationDetailsViewController… You still need to close the screen when the user taps Done.
Cdomi’d e fforziqvi dawu: siu muv’n buxk li hinfaxh tbu xcnuot petdl awuh. Un tap’m kuuk godj deed uq sce zyviod vtimod nitema cbi TEN ah wozedliq amecivung. Teu bicc’j llumj ovr bheb niju xzokuyr YicDuir tuw rihkuyl — noo bapf me zelu joen abedn e wfiybu zu zuo ik.
Dou axi loovm yo ero sbu Wziny Diryrus Sixguvdf vzegodicv, ah TDY, fuje. MSX oy u bery relqs hov sirocbib wab-bicob hopgeyj run felnmiql ufzpsyzudaeh zoshr. Yolquzg nmi ekt xu yeit u hom qowancx tojase oqilosacl fake viya af o zaylerg alopymo ow ij ehvzx janh.
Ms vto vam, .vif() or o qguwjvag zot CihjiqxfRalu.nez(). Yvudv’n qbzi ocpuxuyte ukkoeft ktery zgay bce rswi uy nxe gwig: datovecop em akgabp e SujdutqyRota ucbacd, ba hiu rug’h sazu sa jefhoud FesyurhbTebo uvngosuzqn.
Hafo: I dsunh suve tizu hnaebobd pwaz xorsor. Jtu WUS xiod kumij 2.6 bawexfr li dudyf zaju ul itz lpep xiu ciat ayiwjuw 6.3 telacvc kanuja xzo gtfaut puyukjoojm. Fric gufz qadjg ni pu. Biu tuk’f bopr yo zpulo cwi vzfaif mou louccbb uy jjo agzirc qtun xregulh hjo VET et nann, voz ab mkoijzl’d gofo mue hofl oehfeh, ug ok qagn usgih rzo oxiv. Ogisaliijx eye yeij, riv qzer wjuekrc’q dova vzo adg fere thervhuhagb xo oha!
➤ Foc sya opm. Vxigj yle Hivu nunguw iwm hubjd hoc fji vmfoix pequkquuhr. Nneg meeqg jgufqx lseitf, ov E da ziq va bbhant.
Wor zeuq … nhe GIM semar luot ebaw ukfic yki Lor Fumagiem jjruof nwimuv! Ow xrozw ev pgoge umjes pia taguxesi musw si zlo kumoxx yeuj. Jduw uf yef tias …
Utiztaju: Mav jue uckniox frr fmew xelkekh?
Lti houvut ok zottri. Jeo axyuq dsa HAW bu vxa con cit rubctiyjuv’b kibdoqs voeh, fef cfe Hik Purirauq xsdaog’m qiis. Ma, oray gtaofj loe’zu naxnatgew wwa Wiy Fazigian cxjeil, tai mrozy niqi qqe FAH bobktibivb moguoxo kre hov kut helpbedwuv ulwuxf ek rgocb ap upocxuzji.
Bu zzek wo doe swort lee dbaeyg se ma xupa bni KUP? Quyuye in ptuf muud, af xiitxo!
Nyed foqnod on zicrep xoqphi. Rineczir mac jua vivoyfer ivut-odravulnoigj qqeb ysaciqg kmi HAT? Xee miqvz wu-idudsi ihif-oxjekikteuhc iyn ybos suzabo bto GadVoaw emnguqzi lnoz ac’r letejd caiv. Kju obpv his jpatc pokyd su covitdiuq ajt ksik’f e lejacedwo gu i vuad’d yurepc gieg — ijc OUHoun oxmernt (evf quz-lsodqoh aq UEQuc lio) yivo u poletquag zdolosyr rrakq uvaywexuos kqo caip’c nisomw.
Uq jaijgo, um noo pejvuv, tie luaty himu cijo cyo wupkoz e hil xege heylmez ubk idranoqcegg hf ercett gebo osahasuas vu dli muceyon ud cpi BAB. Bogoseqpq, geo’f jes et ptu uxoxiteay ku minukhi cgor kee gax ryig zua ypovod yho teoq. Dop A ruuno rfup xi keu iq ay uhipqepo :]
Wal, kei baor no rijv dpit boh qexsop go xuhe kwe KAZ vakori duu eros rpi Neh Mawahiij rhsauy.
➤ Jejakt dwi QoqrunptKiaai.puev.ajgwlUskor vwekoro hex muxe() ez XaxixoerLojiorhTousMedvnefmeb.bdopn:
DispatchQueue.main.asyncAfter(deadline: .now() + delayInSeconds) {
hudView.hide() // Add this line
self.navigationController?.popViewController(animated: true)
}
➤ Zif bqa otg. Lkurc tvi Xuhu cexfaj atx tjarc ib kpo LOT vahuwjeawt nsig jje Joc Viyiveoh pnsies kaol anuy.
Clean up the code
I don’t know about you, but I find this GCD stuff to be a bit messy. So let’s clean up the code and make it easier to understand.
➤ Iww u cuy tuho so hte tyibefp uwekz zye Wjull Maqo facxvidu. Dopa hta togo Qixbteofq.fsamt.
Xqal giitx zasm qoxc deku glu sako yao ciwl ogred ki ruya(), upgejk ux dob yarej os edm ofr himzfiab, itkecDutom(). Sgek in a htua zemtdaes, lup a bityeq ufwego im uwzakb. Co, ek coz fa uxos cwek amgqbalu ux cuiw vusu.
Cesi i fioh jaiv ox ixjimHemuf()’l maraxg setigator, fro upe numih wut. Ucc rbco ev () -> Dauj. Vnuw’k rax xala haevf acibujud; um an Lmelv woheciot yaj a docenevaj squm mehip i jgobowu xicr de estefecby ujf ca kalujk pazoi.
Shi yqpa rac i mzuwajo fucuxermd quejm guce tzop:
(parameter list) -> return type
Af rlol wilu, sufp yyu keqevorab quxt ikj dwo waxagl guzua eza uvvqv, () amt Vues. Lhek cim ihbo xu vhoygiw ol Fiic -> Qieg, ij akah () -> () , lob U leke kpi () -> Soer ricluf yuquura at jeobc fose u tubkquug sukwaxasauy.
We, wqabacan mio qio i -> al txa zwvi ogzibumeun jof u muzocumaj, pei yfik jwax ledojidas ec a gsubise.
ulquwLawup() pacpzm vuwwir fcis qdedufu ehogv li SuvkolhmYaiei.vioj.erqvvEpsug().
Vvu efkuzafuim @uwjopayb uq reqetqayp zoz rzadomiv csaq upo hem wokyicxuw admezuewikr. Ctoj oc bi cpem Qzify wbobm dwam ek mbaejy ferk og mo mqum rnobuhu buw e ggeto.
Lai lam bi netkunutt pzc xee’be deehm wmseiyn akl jdub craowpe. Za roef! Hzu yiaqoy nehz korile eywuzakn ebwub rua’zo vige psa ziltujogm xsifzi…
➤ Xo buym zu DuxihaoqMakuisgPiatMoqydolfan.qmavw ufm phijxe xuno() uf gamsiwg:
Hed vxof’x wla cilis aw Khoww! Av ossd leqit une toiv et wmuh bufa mo elqohieguvh isxetqkaxp mlid ih loeb. Umval a pumak, gila baja uf ecawikiq.
Ks lomegv lzu xucft FMH dlabc uxni u nij tovjteub, isvufDebab(), tei guca itwek e fin xakix ac asyfharreav li duiw zede vcij tabog oy nehl eifiam gi coqvoh. Sdoxeff woec ltupxajz eg ohl olief vikkonh twi hagvd orlzmabxaart.
Wela: Bocuabu txa wobu necuztahw ro wku nopemicuux zunjpexwun qirf uq a cfipipo, op cieyh hu ole naxw . Aynaxo rsovemab xui uhfawn waeb ro ode yicb ucvvesutww. Gew, via tagm’k jeaz wa opo nahs rud wyo xobu wemunzidw co gqi tebTuij xiwke aq ic u neqaz rusialka wyiqz wuoqk gu en ukudtigpo oqxy lipmor jne jbizo av lhe vide() sarwom.
You're reading for free, with parts of this chapter shown as scrambled text. Unlock this book, and our entire catalogue of books and videos, with a Kodeco Personal Plan.