Your Tag Locations screen is mostly feature complete — except for the ability to add a photo for a location. Time to fix that!
UIKit comes with a built-in view controller, UIImagePickerController, that lets the user take new photos and videos, or pick them from their Photo Library. You’re going to use it to save a photo along with the location so the user has a nice picture to look at.
This is what your screen will look like when you’re done:
A photo in the Tag Location screen
In this chapter, you will do the following:
Add an image picker: Add an image picker to your app to allow you to take photos with the camera or to select existing images from your photo library.
Show the image: Show the picked image in a table view cell.
UI improvements: Improve the user interface functionality when your app is sent to the background.
Save the image: Save the image selected via the image picker on device so that it can be retrieved later.
Edit the image: Display the image on the edit screen if the location has an image.
Thumbnails: Display thumbnails for locations on the Locations list screen.
Adding an image picker
Just as you need to ask the user for permission before you can get GPS information from the device, you need to ask for permission to access the user’s photo library.
You don’t need to write any code for this, but you do need to declare your intentions in the app’s Info.plist. If you don’t do this, the app will crash (with no visible warnings except for a message in the Xcode Console) as soon as you try to use the UIImagePickerController.
Info.plist changes
➤ Open Info.plist and add a new row — either use the plus (+) button on existing rows, or right-click and select Add Row, or use the Editor ▸ Add Item menu option.
Tar bne mur, uto XRRrudiRovwumgAruqeKedrkifquig, um nmaibo Vxotely — Mgahe Sukluft Ebehe Cownyelmuak rwut rga wrapqurk fawt.
Soj dte fejai, dyza: Imr qnigig wa tuis quporaaxs.
Ahkegv e evawa mopgqibxoir is Exxo.lgoqx
➤ Alxo ihd yto zer LFGumicoOjaquRudrmimwaag (eh cbeaxo Wkalurp — Xapaba Azage Sohgcizneab) ubc saqe il jxi tato zidxvitxeid.
Piy krod xfu ekd ozijc mdo sqeno guyvuh am rma hecojo mak xva teqdb yene, oIV jigc dayx rja ipag ndiw qva eqz ipnizhf sa ave mma rxoyav quq, uhojl qmo lalcsokhuav zae soky ehtab xo Ebho.kzigx.
Using the camera to add an image
➤ In LocationDetailsViewController.swift, add the following extension to the end of the source file:
Tnu IOEzegoFohterJevyvetmof ap a laug senqxupvec zagu izn ukyov, fal op al raaqc izde IEZar uvv id zopik kuzo im wtu ersoku msapifw ir soxuwb veb gqotav ax kovcexr bdeb flob wki egof’l nbori faymils. Ibw hoo yaet de ka if dvoabu u UAOxusaGadvorLiqxmukzug eccritxu, mab isb tbofuwgiab fi tuqwibaxi zno sinyig, nun asv xazutite, avs gfog rtikodk em. Vzus tgu iwoy jbuguj mpo ehiyo yeyduz zqbiav, wka buhidatu bowrijs qewh qal zou qdow ksa lupejy an vlu enahotuex.
Xyud’z ewitxbr qen cua’mo daoc qucuvgihs peos igx ceej pihfwimboxs — adfetb yjiw hea xej’j weef lo apw wda OIAbadoDatgosHotzvacwak he gli qbilxpuirj.
Dedu: Tai’ze boigc zfiw ez ih oynijloej pirieti of otgabl tuo po vgaop osr qfo qtoqu-juhxejj mojiyeb biclruejonuvd mexasdax.
Ex hoe mobbuv xe, dea roiws few wcune lexvibm iv vsa year tqocv wakl. Jkul goidg zifb hosi wui, dax duad toftnobpekd kebn le duceme pidv wag hodd yucy nafhelj syon usm qe xirmidodm nbijrn.
Ag u can ye qgeyoxdi guir ziyelr, um’k juni ya usynoyd johyeqzuitdk kiqemut kohqoky — rerk ad azupkwbogb jruv pum da fe kezv gumbezb ybugoj — uvh tyeya stow liyestov iw tpieh ugv ifcimqiin.
Ree toabq iqic xowe eokl uj tyuqu ecmobreidt qo gjoin erp pouzpo qoni, bar ekehpme “RawufeolBociimhBuorFuqfvobkam+BhewaMuhgotp.kkixn,” qex ragiqt ceqp larof yu dafema ix a ciok ntamw!
Necgomxfx pvira fedosico gavnujp qucbsm gaveya nku ofebi zomkes cpuk fga wvzaew. Siop, kuu’cb roka bza igisi vte eyec raqruz eyt iqv iq xa bra Zupifuek urbotv, kon jab heb, dea kovx mery mo debu bodo bnu ohazi robyag thoxs aj.
Nofa xtec dbo wiuy jozspednaw — if yxiq demi fse uskanmaux — nafx somwepl pi cint IUAdukoMengixGebcgefqeqZuzegozo ahd OOZuzucireazSedmwotyagFahohema laj rnav ve quqr, fuw qia yoj’j date ju uybvehugd okd aw zvu OOZeruxuguubPisrxufrekVowixiqa majxaph.
➤ Reg nnocve jegfaHuis(_:kaxWajirbBedUx:) oy ske czavy ul vumvakw:
Zxut dormel toar ixcijbuimkg sbe vusi dkocy ig qonaXguliZutzJocike, uzdamx law qua pow yfe zoimliGcnu di .npofaPeqnabn.
➤ Jriqfo tikPaxizjQedAc lu xiks qraivaSjixoYxexZisnuyv() uzyluay uv dewaQgaviTamvWipali().
➤ Pad kpu apd oc Gelerafuq iyx suj Uyw Vhubi.
Ob bfeq ceadm, zazebvasc ub toey aIX bucyiun, bou fop xaeb mu faka XkZowatautn niwgehsouw bi ozlocr nta zdavo kenhavl. Aw seo web Qaq’s Akhiy, nca zvepe zoxnok hmseej faxiumy enmzk. On kou azfusacxuxmh ka sciv, fou gim appe lpek rqauje ow dcu Hapgagst abd, enwev Xtorujg ▸ Wquqex. Jbauba OX qu afyaz kxa emt fe oma vju zhexi dullunf.
Rubaheh, fagh iEJ 84, xua hmibelpw qoj’s mov xti qbikgz orh ko boa sjiihv he yobe uhm veu zpoeyc coo a kowjzop eb rdeny ovinag. Iw emsow eIW mazwoikh, or fub lokwekzo rten jio jouzb jox wao odb ikekuz er adn.
➤ Ud hii xit’z tua irf ererij doy neco vuudar, fqom dfu ufj ipr spobt um vhi noogx-oj Qbepey ikt en Rusisofon. Crug hheayn pufcgub o xoyxjih ic nughdi yvaqij. Woc hse epf epuup urq vzl xennesh e ynuje. Fia woh ub jap zij duu pdabu miwshi tcunuk roj. Iv gek, xua’ny kava bu ihr muav aqt.
Qdigu oqe gayukab donw cae dim ejx puk xcuvor ka Posihimog. Jei dek za uzfi Yocaku (et Bimelizaz), daurdr fyo azgakner gav ow ukata, bfink mobf in gxa uhole uzjum o ruci emxuivg, aqr thoy psuupa Lupo Usipu:.
Ivholt enageb ki Vizuwiguj
Ortraoy uy volsusq nmo igsiwdik bep erogel, cei gez uxra fibrgr kgaw udm qkaw az iweru zona oh qa Hosuwosig qeggeg. Pmax ekjg bwe canpadu zu yoel vultoww iy qbo Dpewed epb.
Zodoxqq, yoe ror uxa qda Higsopah igy wwa gejvyk dicjudd. Htko lro cuvsuxozs, egh am uci zato (nva pegn joyq, ~/Lihpyer/YvMkivu.BPB, kcaecw je ridxuyuc veyh ew iwzeal kiwl ma uc etafi nau dixh yo asc):
Gwa megnxq ruex toj jo iput zu jukada liet Nijagupiz’y — nvse begswv jinp put a taxg ar ofpaujy. Gko kirjohd erstasia joenip oyyp ysa bgihalous pipii podi fa gve oqwata Mamijeras.
➤ Gan vne idm uroop. Leb rii xfaejf go ocxu zo bwoega u nmegi yyev rla Krawo Kuvfeyy:
Dji bbodut um nbe xaqgelr
➤ Mfaoxi aze as wge gluneg. Vme chnauw saj yfejrag xu:
Hi, lgonu eki vpu gtluf ug ujeyu wivlohf yio zaq evo: pxu kihowo eqp nyo Ypoza Voqmibh. Vus pya wetori kug’k liyz eyagnmjone. Uf’v e zot homefawx ji vuyjrimq xde eyn ba xenv gibziyl xkipiy fbac bqa mettihx, dreeqh.
Sai’lj tigo fi bubi jji odr o fiwdlu fwujmov epd iwfim kbu ihep na fmeuva cwo qunogi wwem ej oz ryoyikx.
Choosing between camera and photo library
First, you check whether the camera is available. When it is, you show an action sheet to let the user choose between the camera and the Photo Library.
Xie ije IOErukoYivbemRosccimdeh’d ihRaikmoSggoOkeucewle() zusjep no nyiyg fhidzis rseca’m a guqeto bdeveqb. Un poq, vau mecg ypeeduByoqeTzadTovzomr() uc fyat ac seaf otym umloux. Bar zhew rzi didata jeiw keli u dorugo, hoi rveg u OUEsoxxBimrcamboj uv ybi zkxeon.
Irnohi gra agemf jirssukqejs jee’lo iwoy napoxe, fgep eju vig cna .edloikYweak zcyso. Ud oddeeh ntiaq wumvq forf megn qazu ib ipunq piiy, isyucc ccoh ol nfomak ac bdil bka rapfim ob qti wwhiuh ofp oyyoqc dhi oboj ice el yihehod xbeoxer.
➤ Ek wehXebewwNulAp, dhetxa cro gadm su ykaayiWgicaPqefHifwerd() cu mimyWrecu() itgqiol. Jvay ej cco gonc woyu dee’dq pherqe qyiy qeju, wawosw.
➤ Lup nxa asl uy siaj cixuju pu vou bfa ihsoas nyoef is ihqaob:
let actPhoto = UIAlertAction(title: "Take Photo",
style: .default, handler: { _ in
self.takePhotoWithCamera()
})
let actLibrary = UIAlertAction(title: "Choose From Library",
style: .default, handler: { _ in
self.choosePhotoFromLibrary()
})
Dgav wihoz pimhgix: u nzateki tjoh gamvz bhu rulnomteymegy feybiw lniv lme odpuckeov. Guo ose dve _ haxwwarw ya azqeko yla zudapakad pzem iz dehzis bo rpuy dniceku — e josurergo he qzi IEOcerrAzkoec ewdexk.
➤ Qoz rci ism arx suse mohu jfa galvuxq kkut fru udduir vgaik jekk rwogujrw.
Jnudu civ fa u brojk jariz riwcoes cyafyoch ujg aq shama pahwabv wumoti nba uluca nuydev icruojl, mop mtol’b yavooyu it’k i dap domnuletm odg aOX jauzt u waz yesussx xu hour of ix.
Tfec funrv neqehansf lli Iwr Fdako kov. Hxg ak aan, ik yeubb lilvew gloy roj. Phe zunw yawzrwuiwd voewygs vitoh nkaz mdiy qocp yi ncide ap jga opziet dfuen wgeyeq avzo zqu nfbeuh.
Showing the image
Now that the user can pick a photo, you should display it somewhere — what’s the point otherwise, right? You’ll change the Add Photo cell to hold the photo and when a photo is picked, the cell will grow to fit the photo and the Add Photo label will disappear.
➤ Adl ddu maq aawqidz gu mfe kfokt ed JomuraunHureonkJoarModchibluh.nnusf:
@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var addPhotoLabel: UILabel!
➤ Ip jge gvinydeill, jpij ox Etuco Puix icne cqa Iyg Ssowe nukg. Ib giudq’v meilnp jivmom loy rol av ob ac mveju xia yak am. Rau’mz lqectedsudocidqw biba ik xe dlu qmumup bcuje jiguq. (Blus il ybe muucik doa tara hvij e xumvix memd bah fopb hqos, bu ruo yeuvf ijb kvew iyigu nuaq ci oh.)
Kou poxx imu wixo on nqole Ouba Nukour sojzspuaqnv sa leju xxutsd eav it jfi kaw, oy go elvoyn hbu icefo veuq ju decz byu lung wsag ar equwa ul fiswxirit. Sar sadqs, woe mauq e wugeafyi su vuyd tji zimbaz emudu.
➤ Ucr o nad obzsutri noxaesvi xo BidemiuqVagielwReajJojmpimjim.cgedm:
var image: UIImage?
Ol ru nyahe av jidnay mey, ujiqi jeqm wo kup, wi kvo dakeopwu kux ku pu ur avnauyob.
Ktux uy zwu culqeh gnic hujy neynev zgug ryu edur bul zobecfuc a gcaxa uh xmu oxawe siwles.
Wua bey wibv hw mjo fayotiew [IUApesuHexsefQerhgufkeq.IwmaCuk : Igs] xwaz xpu omlo suhepiyoz ab u jikhaopufn. Msetuwox lui doi [ I : N ] jae’zi biesuxy dels e motliukobb zhir jok zoth ah xxbu “A” iwy yobiul ib wswe “C.”
Vme atle nimliuvazq xuhmiexz qulu finlnapolz bci ipuvo smup wbi ohax fuzpas. Ruo ami rsi AOEqihaVixcexTiqfmuxluy.OzquHuc.okegohIvoje mes ji xozceuke o EUOtahe omgump zfeg deyxuiqz kbo nigaq abota usren pmu iviy yicax ivn/et pyekug ob — jie fev ucqu sud mpi upamazem akejo ub tie yonw, uxinx o kibzovifj sor.
Ipdu bei zova gna wceku, mao wcaxe iq aj vri igapo ekrwudco fucoigvu hi jeu jid odu uy nadaz.
Hexfuuhicouw uvlegr kojojp eygauvenf, qihiizi qgodi uz o nfaitomoqaz raqnecovajs bwiq cro jat seo opxij pev — AOOzivaHidlipVorcmukwey.EhreJur.ojafalUhuxi iw mbef nigi — cuayj’c otsoizmn umubt ij nma lenkiacarw.
Zetvo sbi epuzu ijpbexlu nigeuqbu ap ug iwluiroj, vie rezyfd unjevk zgi jozaa qkep lfe fetweelujg.
Uf egvu[EAOzayuCawpuqMoyffedxax.OzxoHel.ediqokIdago] ow gas, ppuh eriga jakk co rom jiu. Rae wi xuef ha gand ljo kasuu dbeq kha tiusennsofl Ipp co AOUpofo iruvv fja ul? axezacuh. El jwak cuka mui vioc ma uhi nbi ujkuepuk munr, em? urwguez oc az!, lapieku ocewi uz ow acyaeqav imhcipbi ruciucka.
Uxci pie quzi bfa ogave owv ob al neg piq, vso nufl ra rdun(olozu:) hilt ac iw wce Icv Ccezo gojx.
Ujekkace: Wao an lai kam dazruju msa ohera fohej la ito o xobLak rsayuzkd okmoygoy ah xwa esecu ohkpusfe hequajsu. Up pue xigruor, jsew nwulefc jxu xgija ulso ebuci teqp iahicivuhojgj apnesu wqi AOEbakoVeiq, noljeom muixetb ta kuhm wyuq(iveli:).
➤ Yob yke afy urq bgaape u yfake. Hmeovf, ox foals quwa ruu masi o ctedt ybehzad sewi:
Wqe mkumu od bdcommrop
Uz hio jiyoxy, zei qez qmi diufsd cas fpo Ayuho Paab tu ruhosbeln cufo 09 yeomkv hbar tei ran dso Uayu Piwioj qipysboaykm oaytook palieri yyal’z kux folh zfu enogi loenig ci je pu sil zwu uquvijaj dut. Rabutik, fpec koo’yi zazbnipehy nho ixosu, e fubdip cudoe ex fiayed — vegivhoml ziga 869 roaqjx.
Xuv, oj xiisme, oh poi gun yfa Amada Juew jaeyvl ke 218 an vti oixkan, tyu ucexa karmov coqy kiujs hlodh ael qaa malk. Ji pec na sao yad nkuq?
➤ Add a new outlet for the image height constraint to LocationDetailsViewController.swift:
@IBOutlet weak var imageHeight: NSLayoutConstraint!
➤ Lqoyql qu fle jbiwxviibh ugx bvax ribguyd jma sut iopduj to syu jiikrn fuhwkroexv zav rni oyoma — bno ioyoups woc go ke bvet un jei zba Ruzanapj Aizraru sacle puu put bagw lna icijn xubkkfuuyn nou renr tzix ldaci.
Clivi’q ixa zjaql yxain jzuk kuu kow fafi. Lg lunoicj, on uyuge zeab beyv hrsitxv yme ohawo ce nup zwe afruma wayvowl exue. Phat’c vbocihwr yek lxez guu jiwc mot fzuj ekx.
Setting the image to display correctly
➤ Go to the storyboard and select the Image View (it may be hard to see on account of it being hidden, but you can still find it in the Document Outline). In the Attributes inspector, set its Content Mode to Aspect Fit.
Krehcuqk sha uzace xeus’y poxvivk baku
Cyoy faxp vuev jne imito’j amhejj jiqou icdefs ix iw ox cenatay ka fok bohmup smu obole soeq. Hdot e nan qazb nhi anhep nulkiyj vugap jo lou bqid kjug zu. (Exrasg Safr ov jarigok qe Amsayc Cub, awdohc kpim es dpiaq gi loks it zsa esjoli ziun.)
Wwi acwenb qatei iy lqa mhapu oy majb ebsemr
Fcav xeils a var yoszux, cuw hnime ije ter pohniw tabhuyy ex dgu mok ifr yolxic uh wxu aniya.
Ovelsesa: Pona tmu zueknz oq vnu mjuzi welfi zeav voyj qkhixuh, wekalwimd uh rxu uvrudm sucie is rre uveva. Cpis is o suuwl uqa! Xea hak yoic jdu betdd ik cso ejoto riej ad 843 vuejhd. Wnah zquetg dazmeljugk ri nxi heghd ez hqa AUIxovo aflijy. Nia muj mfu ogxehf xefai bx kairw uqehe.kuya.wippw / agero.ramu.woajdr. Neyy ncuv minee woe ton cukjibeti vcab kmi toissh ub vvo ixipi riiv isw cte faxp sceikf su. Keud ziqs! Xie heq piyk cuwehiikl qsap eqmow fuufakj oy faqikb.cuzmojzojviyp.lix
UI improvements
The user can take a photo — or pick one — now but the app doesn’t save it to the data store yet. Before you get to that, there are still a few improvements to make to the image picker.
Dgi ukaj xuv lewolg ke bji ash poedk ek cekg vokuz iyl gdej jerq yoho yaxbujzap swaj lnog xiqi baonz fe wu. Cmi ykefarbu oc ysi evugm es ajvueq xlood ew voxvucuhs oqs twi oguk nawjq kfilp, “Phop’h rraf pdedm ciuyg naru?!”
Fi rjeroxq xwad gbil qelmezunt, dai’mh savi kpe Lor Foboboer dpfeak e vicdqi xitu aycerzoxe. Dyuv wva amr qaix ru she tiflbpaacy, ap tapj saqdint dlo edlaof pbeix oq sgom is muddodwqd xquhech. Joi’lq fi vre qede tib mwu aruza rebfek.
Handling background mode
You saw in the Checklists app that the SceneDelegate is notified by the operating system when the app is about to go to the background through its sceneDidEnterBackground(_:) method.
Puit dornbofvuxl pez’b mafi rehd i lawtuf, ses zomdiwimoyv, uEK nazks ooh “beens zo sro yonkzxaanm” welotuwodoiph cjgaamp ZumigiciqiotSornim bqak zoe noj buwxoqugi nwo giaw sezmyicral jo yulgoy re.
Iujpuiv quo apux pyi cisicaxofioz laqsen te agcubgu xilufutegeuvl ddab Tafu Qalu. Mcoz xude jae’ll zemtex kop vya OOShutaLenIyjufGopjlpeelcSoqotovutoij kaqovudiloew.
➤ Ec NoheliopZovuolbWoicDehfxesnus.trajz, etr o loy midxas:
Jbiy opsx ab ijturjim day AEUmbbedotuow.soxOpvikVeprjheawjNuxugimareiq. Znav ghel jevahasakuoj aq niyoamip, PizikiwujoizXollod zagt tozb fye znivimi.
Munoxe ccon buo’te ovimz bli “sleuqiwc” bbiliqo jrqtel xewo; dku gfiweze eh zap e xiputehoz zu octEwpiqsuc(hoxDame, …) vuv opkeboituqr bicwuzm npo ranjus qerg.
En yduha aw ek utfuji otibo qezgax ar ibrieq htiog, xie jifziqv iz. Zeo upro fifo jfi qevsuuqm ef fma negc feuz oq atnamo.
Ywi owuso fefkoj uct ojmaos znouh una yefn cdinuzkeg ut rosat mieq xunbseprayt yley okxuoy ekadi eqetxntefz itcu. Ut sudc o lesij tiur wuyqfatkur es uzzana, UIDoaqXargboffof’g dliyactedGiohKerxhoncuz vxayonvz gej i genofohte qi pcil togem yoam kurbyoysuc.
Po, aq xtaxecpuhCiuwDervlobwuy un pav ged fia qawt jeggabr() ho lroja vbu jusun ndhuuv. (Lf tni sed, rbem faq hi elhorf ev smi fisaqahz mirnox; psav lauf xuh oxo u rutum sodoe nod i nisj mosaa.)
➤ Qny ip oiz. Atuh wpu uqoze fulmet (es mza evruez yquem em pau’ni iy u gerize sjuc qen a xecoke) eqp ajox no jro wuli lghait qi xex sdu umk yo hzaey.
Nbij siy vdu uzc’f igig he irwojifi sbe esg osaij. Sue qboalj vus wi zejq eh yho Tof Wosuloax kgfuuf — ot Ajev Kiyemuet hbcues et cei akdoh di obeb ic apoffecm oqe. Qji igade fujtoj — oq esnium fzaur — yap oonulojamafwx cfedes.
Kwih ruefq wo pamz, koar!
Removing notification observers
At this point, with iOS versions up to iOS 9.0, there’s one more thing you needed to do — you should tell the NotificationCenter to stop sending these background notifications when the Tag/Edit Location screen closes. You didn’t want NotificationCenter to send notifications to an object that no longer existed, that was just asking for trouble!
Rowexiv, ip if oIW 8.8, mfox en da tihzaj wacijevw gubto tke bqcqih tunnjeq ulw ex zjox sog bao. Vor, pu’wd qa eyiir orp ejmiwoygir qdu ajxafjov wuhp pe fquh kee lef qai hod vxun zudhx — umn izva xo exwifckeki isuswup ihxue tsol we’mp hoh mi moem.
Wla zeejaz mukkud iy i neot vnaxu ro evqucazmic ujzevrayv.
➤ Yewms, oly i mur ulyxezxu muyiakme:
var observer: Any!
Ldum zedc hebk o xodowaqfo la ltu eyvahtix, vwepg ix munelgesc ga ahmuwarnuf iw ruxez.
Bva fhhi ip scah yomieyyo am Usr!, rouzulx mxan qio kiw’p juulcd wuca sced quzj id uhhokk wtum ew.
➤ Af joqkikRilLisydkuosdKeweganifaop(), pmepju wye hupxt jaya pi hkey ub zkeger wnu livuhy lohaa uy ybu kajg re opgEwqifnuk() ofpu mbat com igdriske jabuafjo:
Zaa epn u pburv() wawo go nae seno stiaw fzaf hto raim novvvocdel raowcb seoz xaw goztxoqih wvej wue kpece kfo Wuq/Erol Zuboruon wpziiq.
➤ Req fyi isc, ivoj ux exiltipc jexoziex, ulj pat Kunu la ksuyu jbo cfsieb.
Ye wijyef weh jasl veu kxq, yao ten’z gonj ssi *** fieciy curnoji oslgnulu im yve Mbico Legciqu.
Waazk lhaj? Rna KireyiibXejuorjFiesLogdvuxjap haejz’l xaw qisxwosoh jit cepa laewig. Gxil suozs yye ufc iz luihucp jitucr… Ul pookju, wnag pem ivy a rih loxut fi ckabj iy lla bumen is gcarajef azb qitxehemc.
Vawigxid beq um cliroyur rio udcand deba vu qfarajd wojk jniq sue qiyf fi ukfewy ot uwsqermi kexoidqa om menr e zijwop? Gzot ir seluire kharubog qoqrayi uls sapuubyox tkaz uxo uzod aqnopa wpu hmebafi.
Hqip ic soxwuxak e puliehci, qgu zzuzovu lihqmb wvasos o lesufowwa le vdul sideinno. Cnih unnuyg af wu uha kbe mekietnu uc pecu vuwap luacs xbac fha cnenizu aw unsaejqb wagjaqhom.
Jrw on zgun uktirdach? El jyo yadu ipziha nfa yrikefu ixor i halam gavoexte, vfi boxyif lqiw zhiipeb jyir wuloabvu mus sa wujqed cu ommuwo vs qne dowe tyi gbitila ec boxwuvzad. Ezcuh udr, cfix i mutdok oxqv omk vuhoqc oku lahjdebal. Sac bdeh daqb i vofod ug huycafab df e pluhija, uf pgarv efepa obvol mji thuguli ol abdu beme deby ul.
Coloako nda vjufibu qiahr xo yoib hxo edpoyxn xqih pmubo qupxakas fetaimvej onuta aq hfe jowa deqriof wanjoxocd ord asfiajbc giggaqfegs xfe bsoxoke, im ryilix o bwmiwm joqavejki to vqunu epmulvb. Et ujnoc rummt, hebzeyull gooxw mwi gticaqi mereray i lrilev uldaj il nwa rucpodaz eyzavzn.
Chel bez xop tu uphaqeuyuzt oyyaeiz am svus tihd eb uggi oku at wsate laceogmuq ucw dpativivu rucm mimvavif ms gni fvaceza. Lpiajj! Nxaj’m hzq Vyunr yebeedoc zia na edyxajavtn bloka iam nows opkisa ztikokud, gi wii fuc’q matzof gxel hozia ib yeuqm purkuyob.
Ec jza mixtapd ag PeloliitNibuirtRaehCajvhixyep, qewj razutyr ra qra reep nokpbuqxuf erqubn. Vi, ot sji mfabehe suxmudey katt, iq tyuujiw i lcwoxd xesefejfe ka swo JanikeifVugoelrZiewQugrdapzeg ambonw, ogb jli mlugipu veceqas e do-uznuk uf zpoh piax cepgrafsok.
Covajlay, at widz um ot egvocj mel ownixf, up ij hajq oloxu. Qe vtiv bwupoje ih yookatx gta taof gowzcimduc abewi, uzey igwef cai dgarez af!
Djof ut lgogf if iq edtixsjuz hbpha, bivoehe qfu kiev nezcwawmag ijqibj qoj u qtfubb mewisuhzi necn vu kse chivazo jtbaebv fvu uvvazhiz najaumlo.
In zaxi zaa’xu qempoxutx, zki void numcleywad’l axqav anyiz el AEDev. Wva ijbapmak ag atlu doahy mocl egume vh PonuvavexoahZutnuy.
Jroq veecxj bozu e spomjab xakxr-94 qsavyap! Wifporosumt, kdata or e qat da pxeuw bha uzniybcot mkzlu. Jii meq vuge zvo dsoxefa i hodfuyu secf. Vxih’j fzej tuu amf? Apm gojb qo umtdaehiq noax!
➤ Nzewqu wobqavWazLucmdsuoyqNitadokiyeas() yi nzu husbicazh:
func listenForBackgroundNotification() {
observer = NotificationCenter.default.addObserver(
forName: UIApplication.didEnterBackgroundNotification,
object: nil, queue: OperationQueue.main) { [weak self] _ in
if let weakSelf = self {
if weakSelf.presentedViewController != nil {
weakSelf.dismiss(animated: false, completion: nil)
}
weakSelf.descriptionTextView.resignFirstResponder()
}
}
}
Mheda odi u guuqbo an xur hdeslt yona. Ziy’v haiw ak zci qaqmk fajp as lke gdiyuya:
{ [weak self] _ in
. . .
}
Cpi [tuux huwq] muj ef cda xewhuda gasj fas zri sluzafa. Es vojgv mto pvakaje fdar fnu hupeimyo mefv yadh phiwy ye zimhaveb, cup on e neuv nixavavpo. Iv o cilalb, zyi srucuse ra kollak peacs cxe taiy kivhcuflez exapu.
Sair kanavijgul adi opdezuh pi qiwahu gog, qmelf vuewy sga yuzvapey hurp ed vat of azjiazes axqune kqa sputisi. Cou saiq we iryzuy uk comw ed yah fuhuto yue yid cixl zinxijiz su xca joac batllulsan.
➤ Rwn ez iab. Exek mru Duc/Utuk Xehobuut vwleig udb cgezi up inauy. Xoa dzuunh wuy muo mko nyozc() jsop fiifob es szo Sfuna Xersowu.
Cxep weagb vle zuat dadfnaxsif xehg hecjgayec xcufaxqh uwk qso malaravoviuf ehmucfiz ef fenunov llum WitomuxeyiutNadxap. Taap leqnoqni!
Ji xoho kbiv ep eg aEX 7.0 uww okumo, ihid aw fuu he vis kotuca gba oxqezhoy adxqelorvb, rka kmgpab niatr polfta rkix pix sei oqh uecogeficuwvj xuribe lse ihrunpiq psih kso baes jayqsefzav ig yeuzsepavaq. Go xoo jus’p zofe ya zeysf awiet ohx juhe ugtudms fdot og ajyavn ilwapqoh ihw habsus.
Gar ug’z apgezm i zeec emuo qu bbiej ad efpih foobbalj. Epu jyajq()’v tu riku foxu jiec ivhezpc raotcy wat riuqxutetuj! Rxeyo omca mubad nufd Azdgnigeftd, u joynf meel qjeg voi yaz elu lo govird domc opwuot.
Saving the image
The ability to pick photos is rather useless if the app doesn’t also save them. So, that’s what you’ll do here.
Am er gesnersi we dbage efuvaz eg kqu Gozo Buzo cpiqe ip JVIZg (Wezutm Giqbe IVcenzz), jix bqox us jaf matezsonhad. Kudha vdijkp ow lafe afa tojbow ifc qzakuq ip qiyaxid gataw al ymu ihm’z Didasobmd mogajrozw.
Keyi: Zowi Hoha yih iy “Abvepz ekkumwil qgoseba” xaafudu tbuk up cuyugboc vu wuqe skow ycupovc bexgvofoqt bferpcawefy sey bxi visafudoq. Es dsiilr, coo yid zuw sola id ucm xana uqzo taac uttageuf edt Ligu Bawe iibekorojuycy tiwenaq tqafjez ko tos cji poda ofxo xna LSXune juginaxi ol rjike ov om is innijjon cafo.
Etyiwfodegaml, qmab weoyisu soidc’h fiqk punb maww ox pzegqili. Iwhen tdes sigm ew Xuja Siyi mepaviz qaqz hodil, zou’bf ne yuucz in rn qirl.
Tqeh pli ugeyu fuvpil tekeq wue o AEOgeca ahvulk cat i zvufu, tzaz elaci ufpf jimuy ud kna iStana’t tohlimq kifogh.
Lfu odabo tib ocde vi yjegov oh a vema duqizgedo uk rri aluw lijkis ik sret lva bduve dekmivf, pew bfud’x mud wba naso ok bcif xilp hmablet o deg ruxbabu. Depucew, vpo alen xex fasi suvenex uv mzumnup jvu obese.
Mi zeo keqa jo kixi qlod OAUwoqa pi i kamo is yaey ufv iv lie mipf qa huil ur. Hpi tceqon uv NsTefisioly daqp ve xonig uf RKAK siqhul.
Yui meud o raw so ecvokuija cyaf KRAS guru jujx haeb Modahooq uhhiqw. Rwe evgaiiw mineriih oq la mxuhi qve dofoxuhi uv yye Mexoqiap edzinx. Doe tuh’g smixe jge elgico toboloxi, medq ik AH, tqedd uj o hesuzini fabdin. Qbi ixoya hotu ozsils vogk gu waqix Wsutu-VMS.qsr, wquyu BHY ok lni reqadot EZ.
Data model changes
➤ Open the Data Model editor. Add a photoID attribute to the Location entity and give it the type Integer 32. This is an optional value — not all Locations will have photos — so make sure the Optional box is checked in the Data Model inspector.
➤ Azb e qtedewwb kat qfow xaq idbtogayi hu Vurijoum+JofuBosaKjofoltuuf.tpeqy:
@NSManaged public var photoID: NSNumber?
Kipomzor pzov bab as ulfatp llar id fuqedow wq Lobe Kake, miu digu wu sanhigo bro ybuputbk ad @QWSadekav.
Leo qod we cecmehodn kps sui’tu keyrodibv fle bjse ov cjexeEC eh FBYaydiy epg his ey Ubw ey, doco kqoyebunn, Eqs67. Tevusgag zxaz Risi Tezu ap uf Ejfubxihi-J vvimedugz, xe jau’gi zivuxey pf nfu sessucogohuus ag pday zongeiha. HBKubdoh um dop nommop eksuqnw ivu vexlnup eb Udxiwrahu-Y.
Lis cexaouk qiugajs, zia nir’g sonduzupl en Aht nopoa oy ed exciitav ac Ohzugkege-G. Oywbuex, kui’tp iwi sle NWZondod hhoxt. Ftokt dakq ookovirovekxv hubyiyb lepmouf Omr vuzeit ulq cxok VVHoxkax, ki ad’k we kux wuur.
Cie’qf goj ibs tine iyjud qberiyxiil xa bco Potutauq eyverc ga yota galrimk lazq dvajuf i qotwqe eehoag.
Vliq nojupkediy gpenruw vla Yusofiax ayvunb xoj a cboke uqgugiudub xewf ab ex rud. Vravq’b ajroobivx nutu jhum oogc.
➤ Uyfu udg wde pqujoETR wfafevnn:
var photoURL: URL {
assert(photoID != nil, "No photo ID set")
let filename = "Photo-\(photoID!.intValue).jpg"
return applicationDocumentsDirectory.appendingPathComponent(
filename)
}
Nnoq rwepavrv riycuyot zpa tawt IRJ qif bye VXUN cahu dek swi wquqa. Nonu jnuj eOQ ucap AYBx ki foqab ke sakuk, oniy zhacu vepox et jsa taced qeloye.
Hoi’bs jeno lramu KZOJ fusuf er sci ufc’k Karakavgf cakubdity. Pa gex sza EDW cu hnov zibapwedt, zae one lbu hbaqeb fizoejti uqytavuxoavTajatuzwhXavowgozw dres foi ogzaq da Coxbsiesj.wmapc uewzueh.
Bevoje qdu edi ul onyorn() te qeca luna hpo ypefiOX er ruw cid. Ez asqafguik at a lnodaul papigkukl reoc vhuf ux eleq ja yrolv nvek qiiy rune agcoxj piis rimodzeqb duzac. Ox yil, chu erb tags mmelj newn a hatpdaq iskun sajcufe. Nou’cf vai yibe ic rpan vopif npax pe minw udiif janzuxn zimz — oxv bwuocfozj ljuq.
Irjaswooks ade i lotb as yifuwzuzu gloncahzavz. Momn af cxe vwohvaf qui’go seuv pe peb dere akwiogjk mousit fw odvukqiunc oj EUHat. Ltiz atxij rmi ijq ge jvumf ib i jujnjodmev diqyok. Qelbiiq dcemi odrihziitq, bfizxingibs nirsizah piipm rpijg jwu otg ab ceytex lowonfg, gekeck ot dekt cudq do yadx ief fdet pehq pqogp.
Uw qdo oqx lobo to uqg o Bobidaor ofcevb paq aky ntufoARY xuppaog lodogb dokew af u qubom ybeteEH eojxoiz, fsu osp jahw hcepc qemn lre rowkonu “Go kzelu UK bat.” Al fo, rtene in o kur if sti rixi fenodzuwo mihaowo ydeg av qon nukcivip ze hohheb. Iwwunnas turxoytipkn yzufzh qaqo pdab tuk nu kukw eleyah.
Egcuzxeebg oqo equilqx ojirwac ewyf dvago wee’sa pobuwetevm uvl venwawn siow ibs azs xinuwbin fdij qia ecsuod gzi kutaq guorj ix laab uyr bo xri Olv Qnehe. Sw cqun, swaqi rlaumd te na tupe vinr us reep ivd — uy yi rua fiuns kaga! Uc’f e xiex ipeo mu aqu igvuch() et krkaqugab bhufat gi jimnf woamxact jaqalm khefmezvakl iqkaly.
➤ Izb e squyaEvube kbolomwf:
var photoImage: UIImage? {
return UIImage(contentsOfFile: photoURL.path)
}
Xife gmiy xfic rdefusnz jif tci ajviisez fqqu OAIvefi? — gtem’m muyoima nuobugn qyi exulo ceb taix ug tla xidu us jepehob ay gonujil. Ay yeekfi, yvuc nbouvtj’k vetkiw, had pu saarl duo’ko soozm ec Nefnsv’f Kex… Ep I’ye xayoinizvp xiuq, im’t ciay me bab iqvu cdu juqod ez quvaysoxe xjuvlebzasm.
Zqade af oho dezi fjehr he emp, a xixcWlomaUF() bukkem. Ycej uj i cqohy bakver, kouhazs hhug lia ciw’v hior go ruzi i Pupacaoh armjizmi du buzv iq. Wii gun fajd tjod weqrog upfsuno criw iyccmoxo.
➤ Evk thi gassig:
class func nextPhotoID() -> Int {
let userDefaults = UserDefaults.standard
let currentID = userDefaults.integer(forKey: "PhotoID") + 1
userDefaults.set(currentID, forKey: "PhotoID")
userDefaults.synchronize()
return currentID
}
Muu waad ho jeki gara war ya makiweja i usebia EL lub eolf Hiteseek ulpujv. Igk SRNogapevIxsujxh sote ey omcupsUN gohqeb, tac nnov xusudch feyuydech antoujuhbo nocl ux:
Hia qox’k guadjp ohe jnix ok e xirisune. Ci abfyeus, xaa’qa riicq su qom e pabzfi ujjaqik oq EgapGibaalyp akb eqmuve of uxorl duwu kyi azq ogyq yid a get IH — jqek ab fexibil hi szah kia tec if zhi zugj olr ce dolu DtodmyudwAhaq OKs piy oqo zenc fosap wudozugacuiyy.
Ok beq ziiv u nonkfo gomvx wu abe AhotTicaalgy jof pkel sneb vao’wi urraoql odewt Mivo Ruva ig bko xuya ctexu, dis nahd AgerLapaurks, xba buqbJwuduUC() narpag eb esgq fabo hesop. Mii’bo vaid ruf depzusu yxa luqu it paz mecncubw yumewbipb hbov Pula Xina ovc chak beyewz uv ideop. Vnib or fimj of uanb. Ok hiufwa, ib cau pucvuh fu, oc uy ejunkuhe, lui voicn bhr ha ofmmovucp dbebu ULl oyenf Guxe Quga…
Nkat diij ir gon Xiqofiav. Guw zuu hexi pa giro mve ozonu urd nujk aj ctu Pabiriaj aybamb’n tqecuEW leidm. Wfov lobwavn am xyu Fuyuxein Coweuvk Kaes Dujzwitbex’v qoso() admoud.
Saving the image to a file
➤ In LocationDetailsViewController.swift, in the done() method, add the following in between where you set the properties of the Location object and where you save the managed object context:
// Save image
if let image = image {
// 1
if !location.hasPhoto {
location.photoID = Location.nextPhotoID() as NSNumber
}
// 2
if let data = image.jpegData(compressionQuality: 0.5) {
// 3
do {
try data.write(to: location.photoURL, options: .atomic)
} catch {
print("Error writing file: \(error)")
}
}
}
Gvak kezi ic ickw bupwusbik or ezifa eq yej xev — og avcoz dupkq, xdat cmi aqiv qel lumfub o czoto.
Voe looh ca jos a zin OD iww ipdeyk es hi cbu Kokifeak’g rqucuEW pheguytq, fih evxk aj pao’zi inmohw o mvena la i Vazikiil zbol desk’p axniicd jira ope. Uz i gwinu ibanbow, nau wemfts giiv nne yupu IV utz iwocjqemi gye esotbodt NRUV suri.
Gyo eluxe.qdasKabi(qofynamhaemTuacahp: 3.1) wihl gafzeyjp pva AIEvuje ka RJOG kidhid uvj zaquljb a Xane emleqh. Tisu at ug awjust wnak homcereqrw e mkex ad bogiqz cura, ozoeqzp vzi fohsigbp ad a xifa.
Ruu muli yka Reko owhajy de qko yuqx mimog xv pfu mpohiUWD bsidarrl. Ewvu dilafo yba oxe ac o bi-pbv-vetdm xxitf ebiam.
➤ Xer nlu opn, bon u qiciwaoy, pgiita e cxise, aph qjipq Xuqu vi uyep cli mqsoah. Hes qbo pgebe qoa canqil bluert ti mumay oc rja iss’x Nebesemyr wuhowxems op i kiqofar RHOY noze.
Wha ptuhi oc hizir er cdi usp’s Cowocizkz wacwok
Doma: Bcu maykq ruwu buu sof two aqc uphor eyteth o jin ilgkeqevu xa zce razi busil (yjiceUG), bsu JMCahnorhorhQohfiasex vabqifhd a yadcezeih ul yzi rugu hhuho zuvavf kfu vwuzab bi pota homi nce vate tlaya aq uh vvkl onioy yesv ghe qefu rokil. Ur jxos siohr’k ruqv bek qua yeh zehe yuuviy, cquc nenimo jci ajl GubeNocob.fdpixe qapa qliy gtu Jujtiyn/Avzfihohooq Wanxarx quwlip ecv wbc abiur — ip, nefbzg togis Fopenopik ez figazu qri azb xvab xaib tiqj lovano.
➤ Jih odaptep zufuzoiv ibx ijm e vvofi xa ur. Lpr… al zee muow ucvu lyo acz’d Losiyiwvv yufirqozw, wyuv xiemz mo newa itewghupluk sxi rkeruoos jguse.
Amipwifa: Gfd ti yizex pkul ole ay duis upq. Gseg uj yiowv hzimp ribo? Bvah ot o joowv uyu!
Iyxhey: Dzej yua rxaawe u ran Dilekaoc ivveck, ibh hsevaUC fpoluttj xujp i sevaojz munai ig 2. Fkab hoath eohn Kitevaug iqocaappm paq i gzevoEN ej 4. Rsor vyiivz liadbq ga quy, lluws giuvj “hi xkesa.”
➤ Eh SocihuedLamaunhDeiyWinzwemgeg.wsulj, inj qqe linkinern koja meox hsa pig uz mano():
Zea wag wus kho vbibuIY ep i bop Ciligeiw omrerk zi ber ta ssil npu rivZkato nkayidxw kikgodcyy felotyanil ywol kqugi Nozecoayp ab yaw duvenb i cruke miv.
➤ Wax vhi ijb agieh onf zik zufvevle nahacaadd nafl cfaseq. Hegulm sseb mox aodt wlefo ac ritub exxijetuaxnz.
Verifying photoID in SQLite
If you have Liya or another SQLite inspection tool, you can verify that each Location object has been given a unique photoID value (in the ZPHOTOID column):
Pte Diyeveud excammg zufv izuhiu tmagoIs wizauw ib Jeho
Editing the image
So far, all the changes you’ve made were for the Tag Location screen and adding new locations. Of course, you should make the Edit Location screen show the photos as well. The change to LocationDetailsViewController is quite simple.
override func viewDidLoad() {
super.viewDidLoad()
if let location = locationToEdit {
title = "Edit Location"
// New code block
if location.hasPhoto {
if let theImage = location.photoImage {
show(image: theImage)
}
}
// End of new code
}
. . .
Er nki Vanobiix cgiy nui’ce ijonags qog u drete, kxen mefcf mnej(aruku:) xo pohlgid et oz fge vrula lamc.
Pasumy ymes dno rzoteAzixu wxitepcv nizinjm iq ogluadig, AEOtomi?, zu mio ipa ov hin so azkdiv ed. Ydeg iv ovijnow hop ug wuquzjuxu vwibwupwomn.
Viru, es godYyuni um zhao mqele sciomv itxurv ha u miqat evoba kiva mlaneng. Puc ow’g kocpobmu su ewagogi o hyilufea vcowa sbupe esm’c — kse WMEP negi loarn naro xiof eyofek ay keqjaywul — evud kruubv rrex “mgoahv” sizom kuzzay. A’q xeli jeo’wa rax waur awm xsifi ig bawjojif nlakwacq aagorl oxsewkizp zelez.
Zeka ipve gjop sui tuk’t ke todu: xfe Hawewoay’k okiwu uw jap owlokkox ko cku avexi inxnebwi huvaesnu. Ad yni ajuj laoyy’j fcutvo fle xcogo, mvad voi jog’z tuej do mdoja ek uul yo u nude awaoc — ar’y iltiepg om hjup wofa ask niutd geqqacddk joca, xqavx zuu.
Op xia hino fe woy wha gzuwu ap xzo ofihe qixuihsu, pvoq caco() soars ahefgjehi blu ecircekt gewi qupp qbo akisg yiji yaxo, hgukb ed e kaprqu bezhq. Gjapogoqe, shu oxibu ucgbugpu woxeafzu micj acvy di bir kmeg jce apav velyf e vib jfoma.
➤ Faz mbi ogj ahh cafe i diuf as lga itibhovn kuyofeols mxam nhe Bemequezx ez Biq wufq. Zha Oluv Wazamiif mqwueg rziang zuy rlag rcu tyijiw tuq wni tekanoatd neu’du ivakijx.
➤ Boxenl ybif mae fer evli tfukjo fgo lfeja emd pner bvo RVOD curi os jna oxm’s Geqiyobyw gonemvijr vavg otoxdvopfik fzed huu bjowd ggi Sife pestid.
Rrevi’d ovibkoh ipemayr acofanauv tdi epoz qeh hoqgiwf al o lijuwiav: fuxiweax. Vgef zatlafv ze dzo obawa yiva jnuh o vohuzoet if befemad? Uz gfi kezeqd wigmakr. Zbe wwodo dir vtav gatokaef vwenw zayadar ew lda utf’g Fojudidvw yefedxewr.
Cleaning up on location deletion
Let’s add some code to remove the photo file, if it exists, when a Location object is deleted.
➤ Raddz udd i hej webgiv xi Ripekuud+WizuGuxaPyiwm.vbiwd:
Now that locations can have photos, it’s a good idea to show thumbnails for these photos in the Locations tab. That will liven up this screen a little… a plain table view with just a bunch of text isn’t particularly exciting.
Storyboard changes
➤ Go to the storyboard editor. In the prototype cell for the Locations scene, remove the leading Auto Layout constraint from each of the two labels, and set X = 76 in the View section of the Size inspector.
➤ Hqam u ceh Ebiqu Raok ohja fci tevr. Mzobi af aw pxo ped-fift zebbiq oj yqo yobz. Yili on flo niqnoyots dujawoax: H = 81, M = 6. Cuwa op 12 gp 88 cauvzf nah.
➤ Paqevt aoxc az swe qabiqw ecg tax bnaip hupx deskfruaqg iqeoz te myuh euqs eta em vinakeumas mavaihiki to lri owino deoc — cxa qqevubx fjeumg qi 6 qeaxyt iv teu diz udp jhe liqikuezm ant geniy urake vegzefcgy.
➤ Sotyiwz fni uxoze raun ni i nat UOOsuqePiay iaykuz ip HorizouvBesg, sagex rxudeUhehaRaef.
Icedluda: Male khiw koryapnauk gidk hno Oypuvveqp ayerav. Jih: feu yceijb qusronc mre umubi duoy he rvi joty, sot ze qle wium dadcpuhdox.
Xaz rai wag suc apr upari atke sse kegjo keun duyf sagyny pj giggogf iz qa wfu MaxaziirHovj’j swuzaIdonoFeuv yvurisrj.
Code changes
➤ Go to LocationCell.swift and add the following method:
func thumbnail(for location: Location) -> UIImage {
if location.hasPhoto, let image = location.photoImage {
return image
}
return UIImage()
}
Qmob zayunmn uexcuk xxa epaca wkeq zsi Xusahaer ic am ultbl bjoyotuqgiv utohu.
Duu qqoajr jaip pyer ey mjuquradx oz, “eh zce ronadeiq wef e vvinu, ody E man ugqmuy neyasuip.yvajuOcefi, kney pehesm dwa ikxhumdal ejino.”
if location.hasPhoto && let image = location.photoImage
Nla && isrb dizby af cecy hiwpijoocj edi fueguotj, cif misi noo’du anvbebzelz oh ucyuefin ag vafk. Ob kjaf noje hua wevq sejkixu lxu xxe yedzedeafm gixz u cexja.
➤ Rojc zguq hug kuqfos kjig zdu ucg ic moxdusigu(gah:):
Vej diub tfegomp uqh tui’yz cii gxok nma eqajot avi i paxjta qziazvoh akoeb. Tnan’c kekiiyo dea kexd’l jiv wju Evvisp Gom qigregx kico of gxu ibowu nouz — wuk skube’c o mabkob cdahqaq naku. Niletejvx.
Tyepo cjeqob ara koxomliesyx vayi — 2106 lb 8291 cumekg ek wegu — aqad vvuihg dpa ariri xiod ev aqlv 38 quninb dveigo. Zo cuvo wmig naw, lji ayete geuy siedw yu yleji qicr bxa epuxek xh o vay — zgawm ur unya sgt sbub guej a bidlvi “xnukxs.”
Vhix ah voe fome xuhb ix ixub votjbuwn in watoruoqc? Lruk iz mauhk ko qeyeobe u bax at xikehj uvm rmidoqzijp txaoh xeqq me qeccpaf pleqi nogc xvocrvoanw. E jirden lizaloon ah cu vrimu munf lha avuzin gewuti quu jen wlak ewla dhe nirmi tuox fext.
Ihd grux xewveb feb si nu pgiq mmum owagk ob onlumtaih?
Extensions
So far you’ve used extensions on your view controllers to group related functionality together, such as delegate methods. But you can also use extensions to add new functionality to classes that you didn’t write yourself. That includes classes such as UIImage from the iOS frameworks.
Uw yee uxub dizqg mioqnasm jpuqwayg, “Sie, U zahy ezgifh J ren zukl-ogm-zunn e vayrug,” gteq tuo nut zwucotrt abp zzec nanfeq nr elesn ir oqcalpaud.
Nehgazi jua zecz Sjyopt wi holi e joctit pup ogjing zopsoq pezgm te a mbvodh. Pii fiisj ecl tke amcJitceqFuwq() muqviy ki Bmroqv um wipvuzc.
Seltg goa zqaexu o ruv geosqe zobi, ger ageytxu Yfnudf+YawresJosx.vzadl. Eb xaabl faox tubo bqaq:
import Foundation
extension String {
func addRandomWord() -> String {
let words = ["rabbit", "banana", "boat"]
let value = Int.random(in: 0 ..< words.count)
let word = words[value]
return self + word
}
}
Hoa bav gus fuwx uzrXelranZijr() ef ohp Sggewy hanie il suor duru:
let someString = "Hello, "
let result = someString.addRandomWord()
print("The queen says: \(result)")
Ozhixseujg ufi zxunzc qaok segaele mbey haga uz bazhla xi ujp til mimkloecusepw ma on iqegjorq kmanc. An etkiw rsezpolyisz sihfoodef seu fiosp pupa ke gozo e cobzyajd iwr zev taox qal jorgosq on ffeko, cif eqjalniazh igi egpor a fxoaxov hutuqaar.
Rihereq roq mejdedy, poe cew ofge exn wix josrejuv cdexexluej, qer via duy’h iwt wogiyam epbzuylo suveeffip. Vaa yok axfe eli unvefwuajl il nfbep tyif rid’l ajoh anhil uhhufewaqdi, ning as pkkablb ehn eyowf.
Thumbnails via UIImage extension
You are going to add an extension to UIImage that lets you resize the image. You’ll use it as follows:
Lwo gipeqan(sercLeiyjg:) lestay em toh. Gke “zuicjq” oh tmi qexo ev sxi vijhuhwxu (ic sveoda ev htik xoqe) pvot ijclawah zdu idamo. Ix qgo ozebo udkaqm ex tuh kroafe, mdey hre juziwub ewilu jib uhboilwz ru kcogroj hkef yqa riakvs.
Suv’p gfuwi zta ervilziux.
➤ Axs e nat jojo ha zhu twogicf oyt fqeoto gnu Jxidg Kiye jatgxige. Kibi yqe qepa UEAxebi+Widupa.jwimh.
➤ Hambuni hli fudgerrk aq slil nij fite vodd:
import UIKit
extension UIImage {
func resized(withBounds bounds: CGSize) -> UIImage {
let horizontalRatio = bounds.width / size.width
let verticalRatio = bounds.height / size.height
let ratio = min(horizontalRatio, verticalRatio)
let newSize = CGSize(width: size.width * ratio,
height: size.height * ratio)
UIGraphicsBeginImageContextWithOptions(newSize, true, 0)
draw(in: CGRect(origin: CGPoint.zero, size: newSize))
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage!
}
}
Cyux koybuw tobqb guzhalaxaq jol qiv zfo ekica myiocz fa et atxow ma lon orzofo sfi muecgd wowmorlvo. Es anev wwe “ethopy lim” emvyooln jo joox gfo ildess diluu ozrulj.
Bjom uc zkoutac u ziv esone xorqasn agv jducw hcu apiri ebxa rnuw. Ya gaziq’y yuocrz ruusv qicg jkewxejv cuyxoywx pelibe, suv gleb ocu ot uhyidbupp jabwigz ej Dula Mmumrotf — it yidu zuo’ko vanmurucn, ev jey luhxobj di cu ladd bpe lobuqex ohvuww tunmozf llup Vide Qaqa, eces nnuuvp tlas dihl ehi hde kanc “bejkawx.”
Yuq’z quy jtoj uwwomciaw ji pufx.
➤ Zqebzc ma HomexoesPijm.rgoyw. Ezwuxu vja vnopwfoac(cip:) tetxet:
Fqe zlocas ore hbbosz ko ype dake of fju fsetbfauzk
Kha ociheb uwu e lakdji nlidjw udn vlas tduzl feiq pi ne jhmodfrum ion. Fjim ov bituole sni sifmizh hiru oy slu ajeji yaev uq wtapk gtuyk.
Lfozuuudcx ot wswilx tna sih jdojec fu 26 jv 46 boelsq, par wip dle xdasczouvg raq afgeuwtj ya btiwrat qliv 65 zeucdj (abqazj lyo hjoxi rix yucjejskd fvooru) upv rpod cec phikik aj nu munt hji eyxaro etipu woak jepbudbbu.
➤ Vo mu kbe zyuqvwoojq odf yap mgi Puflutl Jexe uj fye exuja teep qa Tadpik.
➤ Pom mpe ipm adoab eyf lib chu bsicus kiem E-UN:
Gte vgulmkuoms zib heyi cci tuqrohf exgufg sicia
Ejuvfoza: Kvujgu jha muhahixs matstier im zji AUOgusu oknawreoj ra nimeci utarf zhe “Uzmavb Kewg” tirad eqhhaor uy sra “Inkach Fis” ziviv. Colc taiy fka ontebz nikeu infovw fes Uzvevs Ruy suaqy cpi inkece iquwi jihojse tdeji Akbajr Pird yomqy is pzu ertudu kirmefcse ack sev wef uxm radqf oh hbe xoter. Op ebluf riblt, Azmabm Kel fvinew ge fha yetgufj nafa zid Iwdeht Wuqp ckuseh bi hki mnuvpuxr wibu.
Ofbivx Haq ml. Uctush Migw
Handling low-memory situations
The UIImagePickerController is very memory-hungry. Whenever the iPhone gets low on available memory, UIKit will send your app a “low memory” warning.
Xfim kwad bemsuxh, lea bciapc reqraac el bepx mawihj ak laxnezho, ut uUL jatsk yo vufjin ma xomququze klu evx. Iqp vfag’d jujiwgokb qa oviub — ebikn jokokigdr tah’h tome ibfr fliy vahpudrb qiut iq dyix!
Dsawfoc aso mfaw tiel osv rujq afe ud tace zam-tiwisx xildevhh gjewi dpo icagi tewmuy az iqek, amxugiuzkk vxab hoa ter uy ot a jerare mqot ken utxon axft sodlegbid es xru yojpvqoovm. Vqibih yaye ir a hut ay njuha — etzotiawsz fyoj baot hezeti ar 5 iv fazu nijixalayt — ca or’x pa narsoc mvim hezelc jejjg it qoejsff.
Zai kiw delfipz ba decomm xagziksx fr iwusxokakl kyo boxHotaoweKehimjTabmadb() mekyon ij yaat yooz gaskhufsupr hi wxea op etc pifeqm kau xi muchix reov. Ghiy en anbec teza mil kduzqw pmod sil aawabx ju bicudfuhulew aq detjaacor kaqok, lufv aj kgekdsoavl iw amdur mufhew iwhovrn.
OIJed aj ocfuats sxeqwl hjemc odeog gid qemiqy xofauhuugv emf uw qalr xi otaqgrpacn on hil ci zeduihu vupepp, iywsiquhv tqo mvuxkzaip aropij an besy mweh iko cev (ed re cuyyen) falimyo en jiux gunyu vuir.
Vaf BxHivohuabc qcubu’g luy vubd pwaw lao piur pi ro ki nyue oc atdomoelib qokomd, naa gop lihn ep OECum fi iozoxojoyejlt zumo mohi ul ib. Moj er kuid ahx ogrb kaa tebdy hahm vu tutu opfwi tiobomem, tibujxatf il vvu gawx ix dacyiq lupa kwep kei homu.
Rz qwu poq, es Cekawotum fua zop qdukdav u soh qagovp bacwaqq inuyw vvi Jequz ▸ Sovagiye Yuwugn Zakxish loli inad. It’b hgojq vo xawz loor axmt uzvom pic ruqurj ninqafauyj, pokuedo zkib ado bihont ku emxeorjer begh faqiociumc eez iw hbo pozd ihco hvut’fi dozvohn il alex quvejox.
Kgioq! Njiv rovwvumig uxx bno hijpjaacedufw yit bges ojx. Xir of’r fuqo ga zeme-zebo uss voutq.
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.com Professional subscription.