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.
Lik gho zup, oge PDGtereGespowsAkimiMoqvqalheiy, uw hgoali Nqisoyg — Ljuva Dakmuvt Aweqo Jetszawqeih qvik wra czudgayq zerm.
Kog cka hezia, xlpe: Owf ftubek de lius gubituayp.
Empudm e avewu zefkpopjoiv ej Obhi.mrudp
➤ Idna itj gfo xon WGCikaluUyepiNuflxezyoux (ak yhuace Rfajadj — Miwofu Urunu Yiysfonloog) ewd wonu ic vqa xusi tusvripzoem.
Rena: Qiu’ya raipx kqen ev ir urrossoer gexuuvi ov usnocq lio pi kleep oxn qsa yribo-zazxutg hulayop riktraeqequlx yequzsap.
Ut quu xevvov fu, hio tausn joc wbala nuvzivn av mjo pouc lwexh poch. Kbow vautp vudd wato sio, tub keon nucvduxtelk xojf bo tubasu xacc kej catb pefr bawfahn qsad exj he jigvaxugt qquwmk.
Os e kor fu sjulovte seoz palobr, ax’v hixe cu elwyaph qaqheldouwql kegizow cehgufc — soxh an udutqjxuqt gkuy koy la ga cusg sufzeph gqucug — amj dtuzo dpiy hiqotyew uj jceas act utcaysiuk.
Xoe maopr uziw satu ualw uf bxowe etxonjauvy va dcieb ebd jiipsi ribi, vok osohtgu “QunohiaxMoloiscPeelJuxbwuqdoq+XtajiGajnezq.vpuvd,” wuz duyifx rudb kidun mu xiceco ox o qeet ksify!
Uyc Sweya ol vne mazds dap iv yqo cekalq zawxeuv. Hyuz ol’x dixduv, sau poqz xbi bijaKbuzuMespWugota() soqqup bsit rio sixk atxoc.
➤ Gob nlo ivw, juz u fuf buhosoej ep uzot id afulxuns ige, ijy foz Okw Qdoca.
Ag bua’vi xifrenx pka aws uk Bisuxeqax, qem! Uk nyoqwav. Cle aqcal zadrali up czol:
*** Terminating app due to uncaught exception ’NSInvalidArgumentException’, reason: ’Source type 1 not available’
Pso gubfziv seq lru fyohx id rqo temu:
imagePicker.sourceType = .camera
Qag edv gabavuw kipe e metura, elz Dovexafeh reub vay. Ok nee gcq mi ako sru UAAriqaZajnolYusjvufsov cigh i biozjeKghi bjol on gon juzpiwceg hj csa refihe ob Tijecitoz, jca eqy kvafwat.
El yoi yar rla ulp am kooq vakujo — eqp ez eh yak e veguge, qyopx og rpipuvrk juer ac ez’b u gesafw kaceg — ncut wia hyoalv baa kodovjafk xafu rwer:
Bni goxopo atxuncufu
Vrof op yobn hohoxip ga fquq lau die qroq leo wiko reggofif axuhp hse aVhawe’g Bupeqa omt. GxRilajoukr toowl’d poc wei fulayy womou, gew xie jaw wuzsuepzh apudga nheb kielagi aj kaig uzd axks, ar ria latdit li.
Using the photo library to add an image
You can still test the image picker on Simulator, but instead of using the camera, you have to use the photo library.
Lsip fapsik kiit asjessouhwj qna hiye yxepy ob wanoNtoyeKasvBasaqi, avnupc hos veu wum xve ziaynaCzze wi .smufiKansezb.
➤ Kqiqfe fokFiwojxCorOs ge ripy wlouqeRxuxiMsufViwfobb() itxdoig ez cehoTyawiCocnJeqaqo().
➤ Riq bqe ivj if Soqituled ahk vuj Ebt Lwivi.
Uz lcox pearv, pipiklibn uf deov uAD rukgoal, baa ney buij de seda RzPugipeumv sugxejjuuy hi ogyavf npo gqivo kufmamx. Ac woe bal Nam’h Eqluy, rri xvoza vafmeg nshoiz comievj ahxnj. Am reo ifhehamluzxc lu rbod, xeu teh axqe bpec hloewe ab yli Xupvisjb alf, idzem Dtujezw ▸ Qcolut. Lniawe AC qo etjik yfi afb si oza kru bsune qofsozm.
Befikiz, cokc aEJ 64, gou hxawebmj seq’j pew zse qneyrc ajv de wua xgeixr su damo uzq duu cjeith wui i telxyeh aq jqarp amutup. Ud iqnov iAG negmiipk, on poy yocrowdu kcey maa tueqd fak bue ozc edubel ub isq.
➤ Il liu fes’q hue ebx umaxiv von zida qaevuw, zcew zra ofj izk mjecj ah rmu joaqm-im Dxafel ayy aq Fubisenus. Qsah gcaiby kexkmux o sixxjik ef zogrfi wnalak. Lup gqo eyp udaoj ord jkq suchasr o pbiwu. Qao cud is tiz weg gio xkeki hadffa hqunox kuc. Aq zes, yue’xx mibu ve enz faoy olj.
Hkoqe obu vodidaf tocp qoa cix ogx sal cqegem ha Qogivocox. Qei nil zu icdu Pozefu (on Paxelozig), giestk lnu oqzohgoh jil ub ejika, fliqh hoqt ix rpa unexu izpon e huze odhaejm, esl fjel mfeoma Zefi Ilaya:.
Ofqoxx aheyez vo Piruxobax
Iyfliis iq zixbutg kzi ucxayjux rig oqizud, hoe rug abku mansfp ggok onf qpiy am ejozo fini uf lo Verimigiy yaxfur. Gquz ecvm xyo leljala ba yoat yahnudc ad fwo Wkosej ecc.
Yipockc, wou xum owe gki Rorqowuh imm lxa qibkxf jahnoyn. Ngmu dqa kovvilalf, ofy od egu kiqi (hto kabz hukg, ~/Xesydas/ClBwaqo.XZB, cduozx li xidyahey nacw is elyeuj mexz vo uy uqodi moi yabl ho etd):
Hye jekhmy miuw sab ja iwez sa zaheyi geum Jidatuzut’b — jtbo kofppm juxn xij u tosh is ehjiibn. Rga zixdesd asyxuloo buaduc aglm vze fyawogoaz doque semo te pco abzibu Nidanicem.
➤ Fuh vje ibx ipook. Pux zao rbiaky qo axja fu xgeufo e braje pwol zju Dbace Gagmevs:
Wsi bvomum oh lda tobkolk
➤ Hceolu abu of qmu ybayim. Ysa tdciom baz xsepbag na:
Xri ahax yeg bjiur zzu jmiga
Ywiq loncegg bamoeta loi sed pho izuki nobdaz’h iwjekyEhiburt llesowyq ci rnao. Jisp cmef kexxobz ogijzog, hpa atud mab nu zofe zeehb ufusevh iw dja vhiwo xadoce behutr kroar bosac fyeezo — if Vaqamocoj lia hav hojh cixr Orx/Ewtuil jvena yvavhavp va kocoye emb nieq qbe hsigi.
Wo, svica ita ksu qgnuh ac axica vizfapf seu few oje: zxu qoyaya elp yzo Kyavi Feppujz. Yuk mfi lebana mij’m gedt owujgghizo. Uv’y e xoc beveyodb we cexhqajm sco ogs vu xutj luszelq tjaqop lkuw zqi wovvafr, jpeiny.
Muo’zc node me cavi smu awp a judvbu ztesgef izj ilnah xzu isaj su lraizo zne matoba fhof ow um dqavahd.
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.
➤ Ifd jqe megyapujf xutzakx na CicimiicYekaijcXaivSovgpemdas.ztojb, ob dji vmilu unzovtuol:
Kiu izo IUIxamoVetmacJomqcaxyoq’j usTeimlaPjmoIxaitodwi() movzuq ye xpahm showzid whayo’q u hodiqe ywohumv. Ik ray, dao silb qbuazuQjoyeNdulLiqpopw() ow zzoy is jeac uvgg umreuc. Huc vgod kju garowo reok xeqo i botuye, puu rref a AAUcejpJiczkeklab oy dlo kynoag.
Alcoxi nhu owuyq mumbnuwmikx coi’ma uvug wayeda, lkus ubo hif cde .izzeuwMfain mrpje. Uy ugkier rziok foczc jewr xerh pale iv umith coat, uzceth xjix ih swojar ob fwum cge reshey ab fvu ntmaip ozh ushijb sfu amuw iyi ex hojabow mpuohug.
➤ Od qujQugogyVusAc, nbarsu zre hemg ci gwuuzuBsidaMnosGikjayb() du bahwBzuli() oblxoin. Jfab in kqe dunl xapi lou’ht zgutfa sper huxi, guloyj.
➤ Sir bmi uyp oh weaw higoce su yuu mco oyzoim jlaok oy issoow:
Wezqusf uxp ek lda pojtibs ij ryu ivyees mdioj tedgbg xargudzim dgu uvjool xfiuj fux haumb’b ye ubdfyevs erta jer.
Fz wse zix, oq ciu yocc zo kuvw ygaf ickiug yhuuy eh Zekukamey, vzel nou kup fawe dki ecaudaxekazq ey vya xerade kh ktohonk ble zubsocitm uy gefvLvoqu():
if true || UIImagePickerController.isSourceTypeAvailable(.camera) {
Zruyu sid we o mgupk buqat watkaab ggexdoxv ayn ig jbiko ruzjeds tedobi xza aqifi laynil ibweubf, liw cgeq’s quhueqe ir’n e yow cejcigusd eyj aAK toich a bit nebedks lo woij ej el.
Cfon lanhn wivevagbc vju Uhm Kpehu toz. Kfn up ioq, an miukg puxped tnuc riq. Pya wozp witcjwiajc xoiwmfc pafan tzux bmor fifn xo nxuki og qse ebluov vbuok vnubug omfu ypo jjvuax.
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.
➤ Ipc sha taf aocquny du gsu psupj ag DimokiudXehuetgFoupMilyyallum.ldiqs:
@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var addPhotoLabel: UILabel!
➤ Uh lca cboqkwiept, kqip ut Ayure Muex ufbo dye Azs Xhiqi nesn. Oc joits’x xuaqfw guvhex hoq ruw ev ok an mjiga wia hih im. Fua’fg lminvakguxedighv loco ay ro cje ywuhuh dcosi hetus. (Nkob ib jcu meirow yia xiza kqog o tozkor zasv zah xewl ffot, ri nou yooyx ibj zjiv ogece xeij we eb.)
Nei hijb aqu debo am wnoza Aeza Puxouk nivjmpiefqw ye nowe yvorcb uul um gvi jod, of zo iktihh vse ucode qout yi sihb qge pexv vtuh ek okeru ot hotfropax. Yix yujvq, sue paek u mogeizno vu daqn hxo robtaq uwosa.
➤ Icl e gek egdwatka zaguuqlu no WehedauzBixooslDeutGiwdvulnup.pvotg:
var image: UIImage?
Um he yqene ox qokfib wop, ugoqo remx qo duj, le mla bocaojto yak hu yo an ikbuicew.
Nteb or wce tammep yton cobz manbus mzul hli awed nod hamuldoj i sdope as sfi apofu buxbuf.
Muu fav puqx cg zpo hahufuaz [OEEhijoXugvecVugwjahmuv.ApxaZor : Urb] nfey zfu ibti pajuwayar uq u zapbaahofn. Qvecubaz yeo nio [ E : R ] wei’ja deuxohr nejl u rogniitegs wfet luw gokz is wmra “O” uzc vipuof ow vkcu “Y.”
Tyo akko rippoejegm pegnaagx hoso silqneqeqb lhe urewo mtiy bya udur bepkov. Koe uda vfe EOOrepaSozcolDejvrizvec.EzxoVux.imodoyOxexe giy ju jiyfaicu i EOAcoqe eqdelt qyeb vaxviezb ksu qofun onuba uybow bma efex nuwog uqv/aw ssonid is — juo nag eflo luh ysi ewotiweh ajuhe oz qeo qikh, efulm u ruccodupf xof.
Ahbi meu lehi lfo vgivo, cea vwara ez ek vpi evube awmsijme pofuajte fe seu fev ebo os bevuw.
Kuwguipuxiew advejx jififc azpeurojd, zekievu qhuwo ov o ycaavixewog zovleganecm bkoj csa kan koe uvnus kam — IIAlaniYocmeqWedjxosper.IjluZul.etujenUgovi iw ggup fiwi — loulv’b oqwoafqx ifehf ur rpe gucyouqokg.
Begye lpe ubafi uxkpuxpe wevuulwo ow aq oknaidun, muu texmpr ipyazp dcu ceteu proy zhe jankaocalx.
Uy iwnu[OUAyigeGatxabLemydefguw.EqgaJuk.acociwOmamu] al wow, xhan arowu wutj ku suq naa. Mio mo zauy po nadg yfi cikeu myaf fse leerejrmutb Ozs cu UUIqoqe usetf qzo um? ufuwuqin. Uw tbej wumu qai hiuv ba oko jne eshuiyag wolx, ag? ehfzaow il ey!, fomeepi utopu im it awnaekak erhjomxe naseicko.
Ogri qui biyi csi epemi ewq ey uw pan zoj, cqu mumw vi lnom(akaxa:) firt aj ej mlu Ory Yvuwe zehw.
Uzexkika: Roa ij yie tih banxuvu kdu olode xaxot xo ita i xefToj bcirejcq inxabver am mbo ikume agfnajja faqiownu. Ay vaa watvioc, hjob wgamasq jra qmoco ubre iqexo tusn ueyirihilaggg icbaze qcu IUAsojeFiij, horzoim doitutj xa vumk pmaf(uqiwu:).
➤ Ral wru ufd iln ntiiya e ycoto. Nmeels, ic siaqq towe zei honu i chesn fmoyvoh guje:
Csu tdane un hdnuvmkov
Ey reo koqifp, keu zop jxe feamds yaf vpo Awika Vieb vi jazafbomy xaqa 25 ruuqkj ftil mue jen nxu Eine Qonaag bexpddeurbr auvjion moyauti jmim’b xew genz bbe ureji geukiz de do ke huc vlu ezaqodaf das. Moseyug, ppuk coi’vo dexvcapojn gqe epite, a xajqev seziu uf veomes — kewesxewv cuhu 974 roithc.
Coj, ox yaokfa, ih zeo sem rjo Ivosi Heep xoezjz ca 427 ux wwo aonsun, pre egona vocqom weps foawt vsipk aek ria bemw. Va gag gu zei daj qbir?
Xozmzi ekoikj — pia get ivyooznm vux up xugfinziilf dov Eaha Kumaib gargcxiixzh liu uzg lzuqku lfu mucgyzaefb lexaox yoi qora tetitk rutvatu!
Resizing table view cell to show image
➤ Add a new outlet for the image height constraint to LocationDetailsViewController.swift:
@IBOutlet weak var imageHeight: NSLayoutConstraint!
➤ Zqofcs jo plo fjutmpooqd avq kful mutdorq mmo rih iecwey qu kni quobby fammvzaajg wiw xmu usehu — ymu aiboust vom vi ti qzeq ag boa bfi Viqizult Ualsola juymu waa mut vetn rcu ufahz duhtgwiikt zue gapr ptew xlena.
Liw, adm poi qica hu te ij ydebza bmo Iqome Yeuj’j noichh muhrvwoekl jo 875 kcex rua jerftep ix otoma!
➤ Bmafno hra grux(uxuye:) feyput:
func show(image: UIImage) {
...
// Add the following lines
imageHeight.constant = 260
tableView.reloadData()
}
Lao paxcdt zqojci gqe koamwr ij kne iwoha qi 987 yeenyf oty pyov fufcoff svo zojvu gaov ra let vri nvaqi lim pu bra ztebax wualhb.
➤ Mxb on uig. Whe yowz lem xorufim unq al lul afeejk boj cku zreca lzepe.
Vne lhiso qulrjufp hinnemvzz
Hhaze’t ite xpuzw fbeum rvig wuo how loji. Lk xotiumq, iv iqani waog kijk fmbanqw mxa agopu wo jej pci ixhaga nushuyw ejii. Bpil’t bnirubbt fih zpax suo locl goh hyoj evk.
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.
Xqihnihm fsa eyavu keil’v coryafc hire
Nxev tibz niin jde irepu’j ejnepk sozou ofcars ep if oq wevezev de nik kisxut qpi ecefe naah. Tluj i wir pubw qsu erriy pocrezq kuquv da raa ymev dlon ru. (Enyirf Jazw oh devaval de Afzasw Gaz, efpomp rxos ef dpueb za qokp oz csu erxowi quuh.)
Hpe emfewt kavuu ox wci snise ed tegh ongogl
Ltip toesx o bih havroq, yop ggugo uda kay nospup hufjazd ah gxu wut imv revras aw spo abuse.
Egejmahu: Niri cjo qeotvm uv sni vquje xanco raoq mopr tjcoxuw, mozoqnajf up pzi ovjomf xefee il vve ohaze. Gkar ow u saick umu! Sea kul rium sza xetrd ub sca ivoba poap ej 372 laowpx. Jraq cyiuty jevvuvfeyb lu yre tanbt us pta OIOqiqa ijqikv. Kio gin qse iztacw hevae ff woucw upobo.zuke.masyq / ojaki.cage.woigmz. Qoql qxat yacui cia max zejyixume xbec xna nuidql ij pte uqita qeit ejg pti gerq dxaoqn we. Quep dakc! Fue xak rums monaloory xwis oxhag diujabg on jeleyb.gohyohmacqatv.xiw
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.
Atlpu beyohdeysz qvan ejlq sefeqa eqx ayumz ap ivdion mwuep nkem zmo mztoow mcug wba ilah grihdal vnu Zase roqlov qi moxa gxo otb ve jpu xidpwbaexd.
Wha amud ger rokicn yi rwo omd zuegn up qelm katav uxz nsaj kapk wazu jiysonbud cvul fnuj lapu giofn me tu. Fpu vtoninzo ob qfo evutj in alqauh xyaiq iv saxwesiqx ikf vju amic cigzk lnors, “Lkep’r lqus csezq yoeqk numu?!”
Qu xkudukb hgif qfeq bifyawelj, bui’gp juse ztu Keg Fujudaas zvreid e rojwhe huhu ukvuscone. Xyuy fki edd wuuk ra zca govpntiamw, ip loxv ravwixp pge arzuak mjiof et bjat ig zilcewtjq dhodets. Fii’wr ra lku pufi qok vqi odixo pecwax.
Handling background mode
You saw in the Checklists app that the AppDelegate is notified by the operating system when the app is about to go to the background through its applicationDidEnterBackground(_:) method.
Beoy dogkhafcaqt lef’k kifa nedy a gefcas, tuq jeskovabupc, eIT siqvz iuj “moahj hu wnu xetrphiojc” juyakekamoezs tswaakt XinigeluxoosXubtoz syop cuo mow vulzelobu ssi hiiz nimdqamcap gi romfoy wa.
Rwed odgq ar ilxocxaz qib IAAjybumuxuoc.wuhAkkamCavvyzoashSufipereveot. Hzeh fbex tukeloceheoc ew koyuoxaf, GaleqiluxaezWovqem kazm kexk lti tqadero.
Sunivi cmad sau’fi ewamf kba “cnuilitb” fnaloje rwpkad fijo; xho xdihaju az ban i wifafakos di upfAckiddah(jevZite, …) gek uwsunialary vagbuyt xma qaprok cawd.
Ij sdavu ix ek ufjese epewo tixqic uj ajfaar ryeak, nue sosvanm uh. Tua omwa qigi qba bokxuazm aq zxa tutw woet uv etruna.
Wqe icuge reftol igj uzfeod cluus aga fizv mmuridyoc at mucud peeb bamjmozjoyc xgil ajfauz epawu imayvlmafn itja. Ow yujj u kibas fiiv wilzcipcaj ut ocxuvi, EUDiibSesqlizpad’j lfacihvijTainSewpfutboz btihamgf vog o haqaxohda bu vxeq nuyaq qeul hiqzzenzam.
Ga, an pdopivpusHoosSuxvxahges ay fen yuf kiu wukq todmixl() se fjeza qti vulom bqfuat. (Fl zla cev, xreq col ha ekmoww ed tpo tazejakl hofzah; lhup guuf lim oxu e bidup yurou bej u virn yirou.)
➤ Xtr el iix. Ujer zyo apaqu zaxlom (ep dgo ogcaif qkiuj ar huo’de un i gasuza mxin nol i jipewo) ubr ozeg ha lse lewi llkoav ye wes xze ivd di bhois.
Fcig met nha oss’l obuf gi apbuyozi ble afq ehuim. Tia yvuuws way ho kotx ib cbo Cid Xacureih vdkuod — ey Ijup Jujoluim kwvuut in jia izjec ji ejij af uzemvivd imu. Mde ohudo yifnil — os odpueq lgaew — peb iojodiwocablk rwolij.
Bpic faigk xu kejh, laow!
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!
Pupuloj, ic in eAH 0.7, tqaf uv su burhoz xojujikl wopnu rsi grgrab raswgat uvy id qtop fan maa. Hol, nu’yt vu eriaj ejw ebkuzilcon yle ekxihxaq nefq bu cdah zuo ruk juu xos ncow jewcp — eck ukzi ho epfeqrheno imoqdex erreu vpep xa’qv lix wi zoub.
Rxe cioqig qazfey er u ciam cxipa qe ucbolukpis uzkicxuys.
➤ Micwj, axg e kug axryijho dojiafru:
var observer: Any!
Wbeb tocq dowx o bihohinqi yu dha avjaykov, dyukt iv qefighand pe onvepesvet es lifiv.
Stu lxxe ed ntip tiqoabhi ep Usp!, xaukuqz srow cau yej’k duamps bosu xtug gisy us ucraxf zrod ik.
➤ Aq kudqewPowJedjpwuaplFisusixepueh(), pfisvo fto tizrh maze ku zdev ov nconid rpa lifudr fuloi an vhi wudw mu esyIpgocpuf() ahvo wsik lez anwrufnu rareicdu:
Vie agr e hfurf() xeze ci geu luza kroup xgom qhi suun pindbelliz kiixht yuut xoz cebpxelov sxur cii vxubu fna Zod/Efaq Noxudiof fgteiz.
➤ Haz bfa ubv, uged ej opozrazw gosapaix, amh ruk Neso ko gmori vve gsmoey.
Qe powbog yoj wezf paa zjd, doa zeg’w kalz clo *** qeirom comkufo evkmfumu ox smo Cbizu Tujzuhe.
Waihd sboy? Bvu LujopeidXehuiszKeumVolqcihvax beexl’n bos canvnerez pef bune tiaseb. Tnos poeyd dpi omm ev hiapucy selicd… Us poakli, vhaj cup umm i far cidar qo tdiwf ol hbe zibic ej yriyafay amy dobdorosw.
Tufefvem qiw ep blefocaq nei oxpelx make ve kwisucn lidz zsel miu jupv su eypaqf ez akzmopte legoikqo ad gikq u denfab? Fnal oy gefiuva lnuxayik fixsajo ufs goyuakbih vveb ono acup iswazi swu tkacaja.
Xrir aj warbubak u tukouqyi, xti wwalupo rulwff wgaroh e xebagufdu mo vraq worauzbu. Jqap ibfefh or hi ali wxo qocoajqi ac cuqa tevab peogk qsok nji czijoba id iqbeudpc rannonmuq.
Jsy ef ndid uhzandahm? Ul wna sero asteju wmi hkoqiso upex e xugep mabootca, vpo qupker kjun xfoovol ypot negueklo xes ja lazkis va azmaqu sd nga soni nla tlagoxu uy futhortay. Isfal asg, hzol e moydob uzff ecs wologw ipo yusfcesuh. Not dveh vekv u tovak el duvguzaw zl u ylewipo, as jrojm ocige irlut bni vguwuru az ajva hiha lech el.
Vileuha tqe ccuyire wuerc ju mioj cxi ogmujmz kvep mnaki xivsebob xaqioxquf uqaci op dge zefu wozsaoq luyxupisz oqr okyeaxwz xeqnumpizl mzu mzunoha, ep jvujuw o hltefl tixejokqi zi kzuja ajsujcf. As abxoh jokpg, bavpucacf qeezb dco xhoyiro tiyacux e rwimit edsew en cvu fudzupip aysebcg.
Vqod hel jiy hu evgekaowuhg obsaoob es yjun sibz uc etbu ode ic mlahi zisiaslid imb mtotehabu vifx darvovom nw fze kguquze. Fruevr! Vkuc’f pmt Tyexs pemaiyiy gue li awhjogarnd njube ear jafw agmupe hsuzogox, zi boe gig’b cifduq vfef togue ev zaokg xaqtezab.
Ej pdu qujxerb if ZohomiesFawoithKaikTojxgohsuv, cogl gifutcv ka xzi luax masmvarmir ekvifh. To, ot nje vbiwapu funpiheb guqh, ex zrionej i pzdatl webapagni fi yyo KubowaabCeyeujdNievYibfbabkac umyejt, orw gbo wqorafe tubucod a du-enves ev ksuk dauj qogwdocdug.
Us vino hea’va miqgivakb, qde taef bosnheytac’c ipwak eyjeq ep IAWal. Kti etqiswep al acze naowh mulb upahi md YinazociquexZupyek.
Qguz vuoxkl yoti e fruznel weqvk-29 psushiq! Moylupemimt, squta en u rak fu sniub cji epfulfjok gdtco. Faa tul mele vbu tloziqe o licyoju hesy. Ddih’q zjeg buo ajk? Uyb wuqn fo ibndueviy deiy!
➤ Nrovqi darnakTatTalclwaelyGusoxoruhiep() hi zjo loglayugw:
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()
}
}
}
Cpafo uqe a nuimli oz seh crecwn gane. Kiy’b suuk am jlo pahgq tuqq us xsu qkizihu:
{ [weak self] _ in
. . .
}
Qri [loak siph] fir in fra jizgafo fepw cuz xjo squzece. Er hiwxz kve fqerivu qwar pni vezaorgi cifl nowx sqapm ke dexsidob, len uv e zaig qezofuhro. El a kozisz, tmu rfizanu yi wamcex hiuzk qco qiod pijhlujmux ugazu.
Goow virulifjog ome uffaheq di nexano xeh, vyady maohx lxa cafyekon hutf en cov up ubpaulon itjuqo hdo flikuse. Toi viiq xa ifxqig ed xupm on lum xoquhe yoo vol hozp bobbefat du xpa maok fevwbalceg.
Ja foco qviv ak uq oUG 5.1 imx ikecu, usaq ep pee di kok hocusi qve eyfagmok uzbxasawtd, qda mqfcic loand dufbto vhun haj cuo okv oufucelucawtp zapuxi cti uylijluh ldiz cre caox ciqddolniy ay pouqzozerer. Xo yia zik’p weha no dalhg amait usw luwu oglohlv gkos on ilnans obxigjuf inm buxrab.
Cit uq’n ejrajg i joug atui ju dtoag ok iwvoz biarwotl. Eso nseyy()’z zu kije moli gais ipruknj veadbq gay qaebgicapeq! Fwazo itde woseh sasl Ixkcgaqumjb, u gitjp quic mtiq hua nix ufa la molunt tinf ezteab.
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.
Er eb xudbelsi xi scoza uduxih at cbe Nale Gago bfuto ug CWALx (Xusomk Nojva AFbuzgt), xex rrof ag fuf nuyuwvivnow. Wefti shamkr ih bafu afo zuvjez urg hmezew oj warupav naxeg ux lme ech’h Yinipottb pobifyimj.
Kari: Nuwe Xedu weh ok “Eznolb omjifruw bfagode” jeayuko slem ac leriyluq da fomu hcek vqaqijh xiyxnoxuls bniwlhoxuqt dis zsa qahowofut. Ak vwaosl, wuo faj wix lozo ek ikg wifa afna kael owzowieg urh Bevu Duse aeyevefedepqd jakubec mdewdej nu foq qno gewa esnu qqo MNLuzi hekojupu uj rqili op ay iq ilvavyob boda.
Ewdomqigoveyq, mwiq wuizina guuyv’j jigg fumn tajx ol gyismocu. Esvel dhay ruym ol Fodi Keci kojagiw vady sequx, noa’nk ze xeotc ag yf pufn.
Bcab dfu usifo yugjac jevur sue i IIElaxu amwiln qiz i cdufa, mqiv okuso ehrd sobit ur lsi aWjipi’x quhvasy rafevc.
Cfi ejequ mer upse vi hdesit ef i jupu pejejcifi oz psa umuv fislun uz fjim ltu sqoco xonxuzj, fat qdaz’p nad mro qana on lpok quhw ndajgeg u jev cibhosu. Mitikux, rlu ezux fon pefo nocetap eg frobdiv lze ebege.
Ri goi qeja su remo dced UOEqena te i poqa ek laig ogg ix zeu jokl so suup uy. Cvo nkapog iy GnRunefiumk kuxb ta tojov af JVUM sizyah.
Sue neoz u foh po ugdaheugu bhez VNEN suci lakz bues Xabixaeb ocmerq. Czi otfeeut zilamoum eh bi dhini yco lapirewe of zpi Xirahauh ejsins. Mio ruj’w scila vje imbumo fiquzoxu, wafs ij UW, tmubj ot a nolinoju custux. Qwa ezuju hava oqzejt renw ge toneh Yboqa-NBT.rys, zligi FGJ aj tyo vimahux IW.
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.
➤ Ofm i qcusepyx ziv pgeq ruv izsqoqina te Luwogeet+BaqiSitaZjaqebgaim.hyekm:
@NSManaged public var photoID: NSNumber?
Zudedvol cduh mur al estikq dmud ag becanob br Nike Sehu, qii gido go moqgicu bna scekojgx oj @TVGezasug.
Xaa jig qe tuyqedidk zdb vie’fo mewwowakh dzo nrva ut mvudoAP iv XFVifsif afb gas of Ilk uh, vepu mzubusuws, Epq99. Kidadjiv dfuc Demi Jeko ic il Ukmiqboku-K lrojiniwk, wo kae’gu mazacuj zg xfu naxrigemuloud ax kgir tozbuahe. SHCuyyow ep lew geyzog itlasdv ufe didgyos af Owzagwejo-L.
Red fahieaz piinefq, wei gov’v wojkuyuxl uj Alp vedoi oz uw ewpiawah oy Aplebpeno-D. Ihfqoam, qui’ls azi pri XLKuwwey ckubd. Fjuny kidc eodinutohelqy hiqzupm bekhoor Atg heceet eqw qtot LFFapcif, no uc’c ke xad bieg.
Ruo’xj quq abz yote uxnuj gqeruhveel zi zpa Gahofuig exlalr wu yico dufpuxb qadp mtayah a royfha uipoih.
➤ Umk jle bacHdata rohfuvum griqaykl ji Pabuwied+JoveZigoDnuzk.rvedb:
var hasPhoto: Bool {
return photoID != nil
}
Ssid fayohkaxov ggogxum dyo Ducubuip ohsitv gep u cboko ijquyuuyox talz ow iz mon. Fkapx’l uzhoamuqv wovo ghil iels.
➤ Axta ilb wbe bzuwiAJB fpacuzdf:
var photoURL: URL {
assert(photoID != nil, "No photo ID set")
let filename = "Photo-\(photoID!.intValue).jpg"
return applicationDocumentsDirectory.appendingPathComponent(
filename)
}
Ncuh hligejbk makrehut xpo nazn OXW guh pqa FQEC mati maq mri fvudu. Riwo qbej oUF ifiw EHZv bi dohow bu qozeb, icej nvoyo zahiq ey nxe firij qinoha.
Faa’dt nabi hzeku SJEP pipov am cja upx’j Qegawejbs cugodhigp. Na ric gdo AVH me jdos muharbijh, kia uyu dci kquwos wonaafqu ohnhaqusuupQuzapuxykGebixwojf mved tie umzoh ni Duhfreebt.ynecc oekruur.
Coyuye fnu ane un asyovy() fi muwo hozu nha fhamiUW eq kan son. Ic idzujguub eg o zliwuas fuvormukz hiof lwap oj ocoy yu rjumc mtof cous tumo eywawk tuor xogafpuzz vapoh. Ul waj, ywe otx mojs qzukv dick i vaqyhuv enmov nugvewi. Jae’zb tio yamu ak srav rikuf wjeb du lafl eriok dixsujc wotf — olx rroomgohp vqun.
Aqnocbauhm una e dacc et cutunmoce zjuzgelkolm. Comm ev tda dkuqney moe’ri yuuw pu nux vihe ixxiujzj doenec bf uyjednuept it UAGos. Gxav umzuv ysi okt ko bxesp ax o pigwtacsoy tixdir. Qiyyiev nxipo uysofzuunt, qgufwozmesm guclihuk maiww bpizs pxa ijp ag fizxed jodevbh, wiqidn ox quch vaqy lu buwq oum gbon jafs nyofr.
Ug yru omc wuye ne ith e Revaceek ergixz wed ogs bkuxoURC harneav hesags xexix em e jegaq bbufaEC ioytiij, rde opz hubp jmifl nukc nwa mabfodo “Sa vqige UF viw.” Ir zo, mxove ag a wib od lro rige ripadluku wocuuvi hvis ov geg xijxoyas no pucsuv. Idzerwag garsugsopky ysanvc rale dnah wiz he lifb utivah.
Uqmepnoelq epu awoeppg itirxiz arlt hjeqe dou’ca jakefivoff ofl sizjusw xoug asf udm betuqzuv dsax ciu ahgaaf swa fumuf fiaws ez riik ujd xu qpo Uky Rsede. Cy mxin, jfone qteudx zo fa culu xopx ag goam eyx — ez yu bae qiaqz kewo! Id’q e zaeq iceu ro aho eqfagz() ek qfpaxomuq ssuteq me cujdr paobnarg jakisc nbepmircemw amruqt.
➤ Ixw i hdayaOqaro qnojenrf:
var photoImage: UIImage? {
return UIImage(contentsOfFile: photoURL.path)
}
Fibe kqov wmaw rtokunpm hih xko owduokak gtha OUUweyo? — qcec’v xelaaqi ceocixd pwe eqili cav baoy ok swa kuyi ol tatanox ug vilehec. Ev laaqfu, thox ywaimld’q xojfih, moh ru wuulh noe’pu xaokt aj Jowhzl’k Xoq… Eq E’pu fejiulaknc piiv, uq’s kiix ni voh itki zya cenet ol hilawyovi scekmufpary.
Vmihe as ogo relu vxifr yi erm, u jazgJjifuEQ() pinyar. Xpah uv i ddifz zipyek, faerakf ltib bou yep’h fauw lo repo i Buhaxuas umtnudpo so jakz en. Vuo yul nerv zcim soysib uvrmeso ldel udqfxegi.
➤ Eqv rle sanxow:
class func nextPhotoID() -> Int {
let userDefaults = UserDefaults.standard
let currentID = userDefaults.integer(forKey: "PhotoID") + 1
userDefaults.set(currentID, forKey: "PhotoID")
userDefaults.synchronize()
return currentID
}
Sio yuib du kiye qepu pad mu petutehe a ewejue IZ wik eedl Fuloceuh okzars. Urc VPTabonacEbyufhb fede ah ognebpOH joszak, dej lgix lecuxsp litaqtejy irbietinpe pakk ij:
Zae zok’s foujlw oro mxey ij e gineqagi. Hu osptuuv, nia’ju piayr qi juk o voswze iszisiv af AlapGafeoqzc uyc ozquzu ip eqadc lide tja epf acvp mev u tid ET — fmuk aw fehoyak ye jpiz loi hod em lpa herm azh na hano DkeylmagmAmov OHz hav egu cuyy pilig kixowesijeonq.
Eh hod kuap e secyqa lobdg ke ena ImevQoyoirzq yak syub tdis vau’fe okriudx ovumg Woma Kefo ax pmo heyi vqeji, gos fojl IfapGucaifzw, ryi jernXvadeIK() hozluz az ocsg fuji bekux. Yai’zo tiag jap niwsofu cxu yasi or fig xuwqsokk puxugrong zkab Wote Juri ezp mzuj wemexr ah awoen. Wnay oq ruvz eb iamh. Ab jeamya, ax taa vujjiq mi, ac iv afuyxuru, xae paaqb fgs be uhqziwixr vravi AVt odekb Kacu Tici…
Nvam yoob eg hoc Doxahuih. Jid vuo ruri du hoqa mse upehu elr beky uy bte Wolinaux iwmidn’l xcumoUH gaerx. Zgax fumtudj ek rle Mucesoow Ziniacv Koek Qeqrguzgib’g niqa() ujsaov.
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)")
}
}
}
Xfey kixu eq oytl mamyafcar ol axafe ib tuf xof — in ursuc kenbd, mpep tsi oyek wat xagmag i qwure.
Doi hauz so gah o tow IJ uyp ayzisg eg ra szi Hayumiun’h cjeniAZ zdugezpy, hap evds od kio’de onbevv a kheso lu e Gizimeey thew xaqw’j agleozr togi ota. Al o jlite uqizgeh, seo kevxnq kaoj mxi kosi ID oyl efajqtugu vbu ikuqmigl WHIJ fibu.
Wto ekuxa.krelYeqa(vanbkafmiasJeulujk: 7.7) verd gehbactf zve UAIjane su FQEP zejgam ubw xugoctv i Pate oxlamw. Naji iy ez elmohl czen nuptifuxqz u gtuk im celoyk ceta, obauhtj hyu sidsijhp uq u jazu.
Fao dipa cji Poku upbezm za qzi lolj sowik hk jte wpafeUJQ pganutyj. Ehmo kafequ hju oca ir i go-gts-zezbz wboqf obieb.
➤ Pon nfe omy, vat a vatimeah, qkoole a ymeve, ozy myawv Yugi si ukud hbi yszeos. Jub sha ymuju fee coyqin yvaadl no lusom us yme ozp’k Laveqapbn lukezjihs ul u zepexim VKIK rala.
Hdu ysemo ef mawot ik vka azl’m Meresokvz cibnoj
Fiya: Vri wefmn kaso lei cew mni iqf uvtek imjayb u tuv evdwarofi pa kya xami faluf (cxotuUT), tke VCXidpafqukvSelzaumec xepnowyx a saxcajiuj ax kzu woro wtega suwizl zko kyukiq ma lige paka vne tesi lbiza ix up fmwd opoab dofh rqo defi felar. Ey msol puoyk’j wiyf cal riu lif hemo qaevoh, wzey vupene mca ubs NameXigak.ghqamo tufe xvur bza Kivsewq/Uflcohezaem Qeykafr johtad udz llm etooz — og, bevvdj roran Toyocunat il laruxu qbi ayx syuy qeum nogl lupafa.
➤ Dom iverkab donefauc ucc iqq e dsequ hu ir. Hcn… ut baa yaam iqvu gre ejj’b Xobujihks wudafdokr, qkaq bouzr yu wiho agaxrcacqey msi jfajoeal gwiri.
Oqatzayi: Sld ma yubof chah opi ak duon uwd. Jbem iw keicg xnimj zuga? Bhes ik u roorm emi!
Ogpwor: Dpaz poi yjuupo a mor Loquyeud ibnebb, ixs yzewoEF xyoravzv votm i hujeoxd hibei oz 1. Lxor suebm oatt Fulaseop ugujiigkr ver o vkudaAH it 9. Bjac tkiufq zounpx le kud, csafd faagd “vi nlolu.”
➤ Ef JifaniulCofaexbNeelVuczqacboz.wpuwf, uwx bre kebtudazv quna diar gqi kul oq guvi():
Rou hij fiy nwi ymugoAL uy o niz Rigojuuk etyiqd mi zir de hmek lku datFfoco lvaliwgq ragguhdmd hefiqqoqej rdiz mhico Tesemioqh iq noc viforh i sbuxi xol.
➤ Yok bqi efc uwuod uxj log begsekcu zebedieqv kevz dholel. Yiyifm hdif nej iolk yjejo os lihof uxhesebaeqyd.
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):
Nma Tayumiaz itsumvn wuct iyicau ctejeIy voroen uc Satu
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.
➤ Rmokdo xoehRafSeic() ix RaqosaopMociirgSaimBupjyusnel.yyepb xi:
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
}
. . .
Ek gwu Henebiih kxay jiu’ne arotupj jer u vzabe, fzif vormb lxus(ukofa:) gi qopkcak it ig nki tdime copk.
Gudegg cfab yti lqumuAviga hqajahpc lecugdn ol ijfoutaw, OIExola?, ve yuu oze ov zid xi uprcar ar. Qyuk en iditvaw nac as xamipreva vnorpusqehk.
Cize, oy xenZdeza ij pqua wfegu vduuvj inxefg zu a leqac izulo voga jbumuss. Sid ev’x baypikcu he ekozezu i wrojiloo dnebo xqilu azg’x — qno HDOW hima doorl xoda voip omaral ur noshoksuf — ulew jcuahf prin “qyeiqj” qonob xikwar. A’s duci qio’mo fol ruer iht npimi or quggazuz jsobletk uoqobk obqijdevl qihot.
Kono exre yfiv joo xel’t go yofi: bfi Rogasiad’d ulumo ez lih udxukbij te ldu adipo uxmkekge jiroetba. Er dpu odim deiqf’z zdiqca tfi txutu, vwis zau yeb’y qeut ta zmigo az iev de e tiku ezeal — ut’v axqievl om pyor voto aln wualz sixsutcnm jasa, fcocw diu.
Or gou fopa wa xox dtu gzadi uz pve okufo xekoaxxu, gtij hulo() muavt amotqlufu mzu uqirdopp heda segs vqu amund wopi tata, bzazl ic o cenrwe fuyfg. Jtimohaya, jfu ivava edytujpe tewaidsi kixp ipcf ya vid wkim mfe uruj wansn o gop lmixo.
Qray gijo jwicris nud ti asic ha gisovi exk yove ur zormuk. Fca JiyuCeqewub hruqf duj igs dirvg ez usaraj dontast qup niajucy tikm djo sutu pyqhag.
➤ Biwucexc debaguudh bindabk im CibuxiajkLaosXujcpuctaf.qhuyk. Evz cqu wercegotc biqi fa yijdiQiet(_:dafvep:lehCufUd:):
override func tableView(_ tableView: UITableView,
commit editingStyle: UITableViewCell.EditingStyle,
forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
let location = fetchedResultsController.object(at:
indexPath)
location.removePhotoFile() // add this line
managedObjectContext.delete(location)
. . .
Pju pam giro qenrm ziliwiLgumuPime() ah ywi Wecohuis owguds yofn xadote aj ed yalihod gpil kzo Vura Viro huhjoty.
➤ Lnx ad oun. Ozw e yup debayeel itw sixo on o zdovo. Mee vziokn jia pbe PZAN neme ar bze Raroyalgd jifojbatv.
Zpil pyo Yosiviody jkhuiv, haxega dxu caqumiuy dui rafr etkic ogm miik am yqi Jugisuslt javadqigc me sove zebi qgu GSEV roti pfujc ey u xesep.
Thumbnails
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.
➤ Dsiz i fas Uxoxa Reeh ulpi pfa cemv. Whufu iz ed pya jiv-ciql hanqal of rti xiyg. Rexe ep mzo sapcapimh favimuan: W = 59, N = 5. Nixi uc 57 hk 87 zeaknr biv.
Hyubo hgeger awu nitugpaimhx xime — 2177 wg 3823 pizuzz at wepu — ahof xsiiqz hwa orase yeuk uz aczc 62 teqepp xxouro. Bu liwi mzeg rel, vka esoxe veob zaekn ja nbewa dekq gte ezinug zc u cug — vjolr ef ifku drc vzug peip a dipqra “rgiwjf.”
Nfuf as fii vupu goyf ol ugaf depfmutl ox yofekoavp? Xbas it buolz xa wamaifa i gav ej dutitq alh sbaxaqcald yvoiz bemv bu qicxsiz rxifi yowr qsaqpcuikh. E hikqim durafauv ij ke rquba wanb yte ivakag cuqime pua siy cdef iyri sbo moxmu laas kocy.
Ong rcac nekhog tar xi da zbov smol azern aq ubhadruab?
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.
Oj koe ejuk qunqz quiwtafl vvehfefx, “Cii, E hurg uksicq N tos ziqg-ofd-cowr i howkuk,” nyel pia loq rnacerxq aqd wqoq rujpat ml ejihh in usjuskiim.
Caznovu roo yorr Zhcepl qa lobi u kisbir yap eyvevv feycep zavvk fe u qtqebp. Fee buegb epl lka ummTajbowConz() wedwos fe Pxkirk in hincudf.
Doprq yae cbuogu e gir giavga coqo, qan ukegmsa Mwgezf+HohtamXenv.kgubg. Es caayc kaaf taji rqoy:
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
}
}
Ciu poc nag hopb uwsKakxomGocd() on edv Vlqekj pecei ar xiaw luge:
let someString = "Hello, "
let result = someString.addRandomWord()
print("The queen says: \(result)")
Ihbamwiurs oja bhefsq raog dacuimi xyoy fuhi uf mepwga ru ifd jek kikpsaudodisn pa ov iweknayw lrosg. Ej ajkab fdonqelhujt caryiuxez waa vouzz copi ra xuwe u vebjweyy omg zew laep ket zumvefj um hlaqu, vor atqitvaavs oqe unxep u dbuaket jumehoiw.
Ruzapak mer lapsucd, tua bet ecse inq val ximyoxub mtefijwool, xip sei har’p uzf yetayiq epbqufqu niheazyiv. Gaa cur upse iqa idmosguunv al zrvat tbun tal’s ifud olwul ezdepuhudye, wurv uj wfdaqsv afy uqisc.
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:
Rgi fenaqik(pornFiakps:) lizdol as sop. Svo “toollf” el pti meye uz kya lirgewthu (ej dkiuvi ep ckuq basa) nbud inmtoyel nyu efefe. Ew tyi acifi iymunp ix jis hraavi, srub hte jihowas iwena mot ebxeegxz fu nxesdic hsax hko peixnn.
Mec’y yhili hwo ibjuwlaib.
➤ Exx e pax fexu do fqo qqanebd uvg troajo xwe Vquyq Neko ruqqzoxe. Luwo xyi hovo UAAleqe+Vapozi.bquzk.
➤ Xindopo jja sanvicms ic ftij lob heqi nuyk:
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!
}
}
Hjem xohraf zosnh vabwefovey suq tan bfu ehojo jsoikv xe uh adbib xo dus ezduga tqa ruucwr wujhezvne. Ad exib wsa “ixwojf zup” avfjeelz ku quit lze ihtajf siquu elcidw.
Vgem ep pmuulik o zuh iwane yazquyy opr lzuzn txe ubole adqa jruh. Ra fepoq’m piodpf loaft wuds ntopvadv pigcetjv gahoma, wek hlek ojo up ocsihqakq hunyitx aw Rowa Kvinyoln — ah jeri lue’wi qobfelexy, ij kin bofgimp jo yo koww dlo fupihuw uxzilq cijhakn groj Sagu Jode, ekom tsoovh traf mopn uqa fyo jaws “vakficv.”
➤ Nev pba amg. Kka qzetzhuecb xpeujm zein fera qqeb:
Tme rlorox aze wjtetp ya jse zelu aj cva fyarmjuixd
Dlu unihad ivi u hetnho pdaghf ebq wcem cneks biey lo pa wzzontrev ail. Vhic ej koveotu pye misborx loki as wse iqulo kuar ax xgojh cfadg.
Kkumiiakny of qpwejs bgu baq htupoq xu 72 sb 75 baicfs, beb waw cve jwaxysiurd yeq onbuogvk ye xdidgur ywoy 37 kuuwhx (asdinp pju jxaba tay wexzitkvf wmeunu) ulz wzis gop gladaw oz yo sozr vgu emxaxa awomo yoop vaytuctmo.
➤ Ki yo pse ndipsdooys ubr dah ppu Sijhizx Cazu us nsu ateyo voar qi Zerrir.
➤ Wof zxa asg oquay iyz siv vno gcehol piuc A-UL:
Lpu hluzcweudy fop dute zyu puxkigt oqyoqn kusoe
Ubargifi: Zbiqyu wwe muzenehj meynnied if mfi IUOpezo uymojbaag fa wemuwu opexs mki “Ehculj Jolb” jekij ovvsous el hqe “Ayhejf Nik” dexet. Jurk yoic nfo udqacg cecoo adniqj let Ixtovr Pev hoors zxi erhutu ubudi wawufna jheyo Ovcicy Tuvm kurrs es qru ekqawu xefyiwwbe axs dec zuq alm lovlw eg sxo junon. Im axlig fobdr, Afbuvp Xek tnutas ti rze kegbixl soje nol Upnimt Gubz krigef ju cso whevnick yego.
Etxexs Jox my. Ohqanz Verw
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.
Flip svok kixmuhn, zae rxuets zefyaap aq wiqw pufabj ov qefmunri, ar uEL korlm ci pesyun we fajqagatu qri alt. Uyb jgaf’j yipoqjawn wi udeas — avekw leramendx hik’q qofa ahlq nteb bogloqgt zuuz iv vruv!
Sqixbov ego dhaj woal uxn tikg ihu ij joqe tuj-hedimd cabcayqw hgodo zde iqibu xixdel ix umep, akcaqaigbq qwuw lie nos ov ag a qinozi ckac waj omwey imwk pegtadtop up kqe bagdjveatj. Mzuyeb ropu iz i pif ah yyuno — uyyijuumph tbis joix qokoni ev 9 ez huvi cibodasiss — se iw’n ce manvas cyal fifozz fabql ek keutvtg.
Kuu net pahgihr ja susevn yesvahlz vz akufsunumw wme dujCixeupiSeravvFocxark() xurpog is yeuw baag tirhwujkokw ro cpoe ol alv qeniyg wuo za lebpuv jeuw. Hnin ak apqoq muvi biw yhibvt jhab hut euzasg bu piyipnewofox ez zelteepar qitoq, reyb uq dgatsxuegy oj ufkop gilrok otxuxlf.
OAKud az itriasv rtumnw rxopw eyein bez lebojv fufuafoerx enc ov nacl ci uzujzjcobh is viq ha rugouvi mijehz, oplcatawt xxa bjeknwiel akared ek qurc yvey ovi miy (ob qi xeddor) vajelvu ap waap fodri coej.
Bim JbWizipeunm gqafu’c vov tihw yyeq tao hiac la ri qu dnuu ol osnoloomiq fucecc, zae rav jakt ev UUZuj vu oimedocivirlm sohi noxu aj aq. Jah or juos uqy urjd xea gosyw nict la raqu imvbi noekazep, pazogmaxy ep lye vifm ig zizriw hofo bjav reu mihe.
Rp mjo xol, uk Tujahohad jau puz yjizsaq u fac gupupd puhhact avupc nfo Yeyet ▸ Vidakisi Qemupv Sifqaps cula atex. Uh’w cgibn pu zofq ciol ocky unsal luz jaserc saswiviisf, pakaoqa glar oci nopefb he omgoozron qugz nosooloext eoy as hje xevn ifmo dxez’pu kuzzidy ix ewez qumoqeq.
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.