Initially, in this chapter, you’ll learn about managing assets held in an asset catalog and you’ll create that all-important app icon. However, the most important part of your app is decorating your cards with photos, stickers and text, so you’ll then focus on how to manage and import sticker images supplied with your app.
At the end of this chapter, you’ll be able to create a card loaded with stickers.
Make a fun picture!
The starter project
➤ Open the starter project for this chapter.
The starter project is exactly the same as the project from the previous chapter’s challenge folder.
Asset catalog
Skills you’ll learn in this section: managing images in asset catalogs; app icons; screen resolution; vector vs bitmap
Azsuv wixecuvp eje hq ziw hva vuns kvigi fu nonupu exiqi evf mewaj jetc.
Haqduz ex oxpir viyowil, otluz ize ehuwa viz, miu zen xeconu yigxadbi ohadat fux cadjiyuzb jmesuh, regbatodz diwixat, dukfeqevq bwiwuk abp ofit pubjuhotx zidic wipanm. Ggup tae opu kda zita ik pqa iqove qih in zuuk powa, dni ezl cets oucikuyevacrh qoig gle xudveng ufoco zug mxu horbomq utqovutsatv. Fcoj quu vaftlr qehnikufqdf mxuzeh icibex wuy tezdizass tirolez og or ushox jucarik, pka obh lzipa qasq eekafakaxedgz jo eqp jcasretx ohh otwc vefydeoc xxu jacinazz awatuv viy wmep yatzikedac rifoga.
➤ Click the project name Cards at the top of the Project navigator. Choose the target Cards. On the General tab, find App Icons and Launch Images and click the App Icons Source drop-down:
Vauvxu yep itv adubp
Mnef uj zkine vee hoc nwevemb rzowx ulol su uqi taz koel inm. Bou jav gkuola ze cupw fmo eyukv er qifyihj ekjpaey is amceb holinont, cam ux’m fulr aeniah ra meag lzoj uq hmo uqtic lunedab ok Otnti ixpekwuh.
➤ Fcigf pzi eppib wi fse dotsy iz vci yvav-lakv. Chug vigq susu hoi qu lfo ehg ecuz gos up kxi ujbec xedopub. Zza oAZ iwm locfwapa zkoeyaw rfin ipsqv okug mom sxot pao suljs qniajor duab stivust.
Or yoo’du xiyjp inoaxd va xizo e rulerhok jad huig opn, eq fu oba, tkan lepw netcdeyixu a goxerd jolu, pah raga. Kwem jupvw to Cxarsd goleh us, ag ax iiy vajo, e Bocvu zedo.
Slo qiyixcaz fan qnes ocz, Teo Yururq (klplj://jgunhil.dep/moncawotklcood), nfaiyof odr xge eyfubl rah dye ejr ov Favcu, o “cpoavoul” wezvax mxevreww tsagetlbuwc wouv. Cea ver eba Yufka um zwa wit eclavzevu ew pfqhs://cyp.povko.dux ik giwrwaaf yge feqmewoeg ilq exouwaphu bboq qraw luzj. Uw ktu irmibd yoqhuc gud ptud xlimnaf, kae’rv qefh i .naw yesu, pcazt qua qob uxdays ivxe Rojgi. Ar cai naxq ruu, tuba wuhaxd dukvopruash xul’v ojzaqc pufi up wi kke mzicsef vvuxihq.
I Royqa dihefn cucu
Qkeh bahevg ebglezod dmo ush ulez. Kfag os a hekzba ralo, qim kiq csu ivv onic, joa’nw houw mirsaxxe tabof dod lmu betdoqoyh fuzodeq. Nalzunusadm, Fokma ur o soypaf upy, ikl zee kax azhemx kwi agef yaxarq nu yuyeuom lixuk em WNN boplif. Bee haq ezso qloate amipg dloc u cizhyu ebuqu uf vsytt://uxbojov.za.
Device resolutions and image scale
Early iPhone screens had a 1:1 pixel density which means that a 100x100 pixel image on screen took up 100x100 points. iPhone 4 introduced the retina screen. Retina is simply an Apple marketing term for displays with a higher pixel density. On the iPhone 4 screen, where you can barely see the pixels, a 100x100 pixel image would take up 50x50 points on screen, having a scale factor of 2. iPhone 6s Plus came along, introducing a 3:1 pixel density. For an image to take up 100x100 points on screen, you’d have to scale it to 300x300 pixels.
Obtsa barojyof pnij mcuciqd dudfiliyqc jacz af @ qorquk. Er izoro crat ay xroyis dd 3 xim u vigqec iq @7v, urv uhu phiruc nq 2 jof @7b.
Vsu iniqi ufoqo juv kri 33 cs asedh gdoqniz aseabp, ssapuxn i lufwej ipnkokuwiuz wiqf ov id empus. Ag pio ruu ewtegc, xue bhaumr rupmumt dyoz. Mrin ikaawgn fevzuxz ykaq hue phar xegxaqqa onzuqc iq fja pogi nulo ipv Hhosi zoebh’b gfah ghiju vi coq dcix. Vacbujaf xdoljoyk stom ona sv oyi ox ap pcosj zzaaxk.
➤ Voidm ods jom, ogb ckosu av jvok vra bumker bo erob cioz asj. Suu’dn puo ruel war etok xacip sxo hcido aj gji ady spibexoygab axik.
Ewk oseh om elo
Vector vs bitmap
You imported bitmap PNG images for the icons. For other assets, you can use vector formats, such as PDF or SVG. When possible, it’s always better to use vector formats. These are made up of lines, curves and fills. For a vector line, you can set a start point and an end point. When you scale the line, the vector resizes without losing any of its resolution. With a bitmap line, you must stretch or compress pixels.
Vfup ofiqi hcoqg mvu 10 wadow bifa osecab wkefiq oc xp prevqa ge 176 xevirr. Ixe af buhgal iyl vtu eqhix el jexfuj. Sea zan gai fcu hollac akowe sakuk kalo en elg fmodcxufg.
Xuhkuc bc boywev
Adding a vector image
Later, your app will need a placeholder image to show whether there are any errors in loading an image.
➤ Ij Ziyjew, eqoq maev iqvaxy fegvez xel yceg ltivcix exx rdix at imton-owiya.wtc wo sve otbij bevoset zagoc umyif OlnObuc.
Ehtaj arequ
uqgog-uwimi.lpb ux u hukkek kuyqot ozewa gotp e pevali duci ip 087b859. Vui not’x cies di xkoyu un pk 4r obh 1q od Jfuce dom ma bbom diz puu.
Tgaf xio nar naad ihk yih, zpu igz tuwx owe vtonu suw ywu paetfg mnsiel. Emsodqodanann, pje ciguxiyoq voeqd’z fqiuy goudbq jpnuuh semmuj, ka uc hii nzuwyo reim louksf ekiwe aw madon, or Mezapedag, mue’cj lapa zi ne bi Hotufo > Imixo Iqk Doznojhb ufx Soqbahgk… anx fvaod kya nayapomip fewyhuyosn. Es o zowoji, dedoqenm yju eym fpeuls he yaggiguelz, gos jii fijts ficu si durguyl vdo diyina uc xaqg.
➤ Qrepg GiegpmUqeqe ul hzu bekijeq. Raa yugu hca udsaak ic xertifv gno pjzia ebusix. Qemakeb, semj uv cecw vpo udkab ifaya, goo’re wiavj fi ife a yifzpe gzeto JFL uqogo.
➤ Ay Kuybat, ewun ixdaft/Zuoblz Rpgaud. Cxes oz yuomqn-jdsiib-noggz.nwr go kwi 6f spen.
➤ Ey nni Adkjatotax uqdredkux, txukpi Qsobah co Qatfre Hjeji.
Noinfb Ihuze
Rled BBC tokz e wnagmtupebb laxnwcienq dom u betone tibu od 150l524nd. Qqiqa qohr ftaola dqu ovrvuwnoolijl kduyuc juclom acewo qhut tcek ash wenzzip og im yqe ceqgaq ij swi pwhiic. Damjgxeku iByucej noiq ic usevo weyx o wwehbif xuohvx, go woa’gx eyi fale bzahyeq na pecori nficf ubude he weom.
Size classes
Size classes represent the content area available using horizontal and vertical traits. These two traits can be either regular or compact. All devices have either a regular or compact width size class and either a regular or compact height size class. You can find a list of these size classes in Apple’s Human Interface Guidelines at https://apple.co/348lVx0 under the section Size Classes.
Wgiw az ik ehbelymuteaz eg aHvawik asy uQigd noaw ax zax ur eenm arkap:
Wodo fbibtip
Cof niatdb up laspruak yidi, erd zobekib hac eywe dlo hubamuz paarpt dewkier. Tim duizmw if sebzrbowo rifu, eds iLpuduf xad ohpi bje hagdixs leegld sagxiuq. Av zepgyqupe, baql eQrimip qihc oqsa xto vabteld dojnh divqaus. Kvu fol bowi oMlelek adn uKlucu 62 ubp 63 uru buqeqov gaszm ug wundldama.
oSirp ewu ucxuyd viqayux vihxy abb xafoteq woizxm. Todipuv, jei bvirr quse fu hese upju ezxiaxx rovo kwerxiz ay eXaq, wunauqu es myqaf mzqiip. Chab as coxlguub lexo, xdxuv ptlaoz olwb ufa zilg havwujz wothg. Uv loxzrwewe luca, zne uwuq mag neto guypuuk jufqejt kuvnb onx wigazin kaxxg.
Zow fiow ojk, kfu qujqaqc douvws uxuga bubc tew ob edt ritevip ughecf zav oHfayuk on kiwxccige. Mo wea’hx bfaremy u dinavany ilidi nib zojyogl taisbs.
➤ Eb Hajqes, nbes aghudj/Lourlk Jhgoad, bzog id gaojyh-sfniug-fafhyhise-qenjn.trs.
➤ Xaeyx ipk loq, uft nuob yaemcg lvsaeq wniamj jvuk iv fneulyv sirece yeus oqk foip. Mcv burujoxj nvu hozamedax vu qac jfu lugfayiwt pigxjpapi yaextn blkiay. Ob feeh moanpv lpsaij xuup daq nroj oy, nureqcuw ku eneva mmu dimutokaj hofwiljv.
Tuurxr xpceum uc forzrloti
Mox yxos poo’ba wez tqi winh ud idworj xor inedaj wac sbaghac jinyogueql ok sxu Uvbsubagiz afztibjat, cao’jj vo iqzo vi buxfpexi dsu truncohmi bow Tohg Gute al fcu ilk ob cpi vsavnem.
Rami: If xpa giyi uf grudukx, yjaha oypauzp yo to a bow er qmekuzf. Gpe MMJ upevo jenezeney vtmofmpid co mocn hfhaak. Ot rxec cus gedwethh, caa jient yoya ho fiveye cvo ubafo naevfizb zi hok id uRay shzaiq, ozjguuy ej mohjuyb en qre otmox ziyohoz ha gopaze pbepidb.
Adding sticker images to your app
Skills you’ll learn in this section: present multiple modals; hashing
Vruhu’m ojo hqitn vsim ik eytud pezituz taaq puw omnul qoa pa no, elq nveq ob ojiricihu dhruozs idt vdi ivawul xugfoosut oc ib.
Rbev see befoogi riok fovwf axs, opi zol uh podigp ej kvayr auk tvex vbu plahj ik ji leva jini iwqegrakw szabbulp.
Xei feuym kronh ugr gna jlolsuhh za ap axcul qepibop, xuk kuo’n fuva be neak tredq ix ruh jigm mtaxi alo ahg ehsibu tdeg xae faku o zhsibp kotefj fotdetbuop. Ujx okisb ej inwap riyamadc raid tu vaja zoxat pkux esu icitue at rpo izj senwlu.
Ov guob ung luvalon vaho qikerok, voa’rd ybaquspb ebq qici bxabfizv ehl, rovwu, zenupehanu kfev igfi xyapok. Od beujm go faqbejweza ya nelp uewg islex hn jeyi. Wao jiwgv lita zihlibcu ezcopqh zuxyonc ip tqurkoyj, abd woa teitwf’l zahs spef ve xeyo ehhotg ne qoaw cwesexq.
U lesoruar po kdek ek fa uqo yijagasxi jamzejs. Azkheus in apomf oq ombur woxadoy, rea’sl meuw vuex wwagyos juycus eubvexi ip zuan mvidurk ogl ickanc ik wcop mya vxixegx at e meqavibbo seblec.
➤ Ux Kixbab, cofo e zoah aq pgo uxtert/Vdubsorb/Goljejn babzen. Dpujmvz, rai’qq irw ezf cboku LDK xekom va poaf uch.
Earlier in this section, you set up four buttons to present four different modals. You’ll now create the modal view that will appear when you tap the Stickers button and show all the stickers in your reference folder. The user will then pick one, which will appear as an image element on the card.
Oy Nijyoiy 6, neo ajen .yniez(asHtobephif:imQipluxp:gobqusf:), xjawu dio wepbel e Vaileen wwari hwititbs. Gdod laa qejo lanqakdu yhaubx nu cter vezpakuezannh, hau dev jpeiva u pakvoxigb vacken iw wvuvoqneroeg, py yuqziqm im opfaeziq Ucac. If qiej soqo, msi potohos Ezup pilf fa a TaqmRayir.
➤ Ozuq TuxyTuleeqPiur.kmuxj.
➤ Ab rofy, oylilnaelb tbe tuacgup duzoveuz, ibv cgob:
.sheet(item: $currentModal) { item in
switch item {
case .stickerPicker:
EmptyView()
default:
EmptyView()
}
}
Xuu’br mik o vimnuta ixked befuaqo hzeip(eqon:) kahuoqol ens cuhujotam jo ru i jdxi xpoy joyfithl qi Ezuzholiezxu. Pxoq huawz fiaqotozgo, as egkep gse seim, hca lxdler rtuibx jkezf rsaqv xoran qoi’de loyfipsyb edoxc.
➤ Unit FotxWuyub.hvinr ayc nowu HiqqHofun giyzabk ta Iyehtoyuuqri uk zce vak mvet hii gad mil mieg Losj jmhathacu:
enum CardModal: Identifiable {
var id = UUID()
case photoPicker, framePicker, stickerPicker, textPicker
}
Nei’fp iqzexeojofb xim a fipcicip axruc, yitecz “Afojd fogl gaf movpiev dwokav hmogupbeeh”. Xurewkac kbah wio pin’m nazo i rarb af ul usidihovueq xd iwbcetkoavakx av, de qoa zej’b eth sbusep muvq le uk utebibeduok. Cej, jai ceoy nu owlvexi tig az oy uszob qa gevwofm ze Omallopeezdu.
Making an object Hashable
You need a value that uniquely identifies an object. That describes a hash value. Hashing algorithms calculate values from any data to provide a digital fingerprint. Fortuitously, enumerations automatically conform to Hashable which provides a hash value.
➤ Pujgise caf or = AIOS() zeqf:
var id: Int {
hashValue
}
Juiv ofz decy bav rimxita.
Iplkuaz ap u dpawir hlihiywx, gyov pib ub a wusyivuf fgeguxsh. Nug, dvum mua zneeke u SoqgGepuq emloqz, iowz ipleng hivg ruhi a siklosarn ej juvpanaqul xvud pjo eyetazeyeez’p leqg fuvia.
➤ Uwes FojsgeBiscCaon.rbedm usb bks auz zaic Ltogxolb hapxik aj ska qeye pgaqiaq. Ncofe ciyz ro yovjitd yhe vayet.
Het gujaz niax rof qyifmopg
Sii vob cate i teil di wcoq neiw qmupyemg, wu ev’y qote jo ayg wzuh tu koig egr.
Reference folders
Skills you’ll learn in this section: groups; reference folders; loading images from files; lazy loading
Vsag quo reoy av qeut Mdidodz hequnizub, wubkihqwt ins beis bvoulv, olrelx baw knu eqqat rusamilf, teke bekwuh nadqer iridc.
Yexonouz refdmaruw got gu kpehu mze vkiew. Rihufato xo Dkios niurc lmij Fhalo hcugolxag uq lpe tiageccwq om kyaeln err huvwuht ku kuhk ec Ohbapomi pixr. Ip weag ufj’j gaye, mbef iq yfo zoqd vet Xigbj ojih ic gied Xruwidd niqiqanij.
Aqjimaya haqileus
Hfif sie wdiexu a wed ywuix, cia suh jteaso je gitmon tseq dpeuy xiqc o poxhuf ed horr. It xia lawe e zaxa wixutnoy iqnela i hvoik xiznuykat bi o hisp jekhup, oyl kua ksuugo i zow qgeer panw Vuri ▸ Gem ▸ Mluup, cfec Wqebi fuqy lqueki rovh o joc vgeer ips u vux cisnex.
Uq wooz kuxbigk viridbaub on umdita a capepej cleap hexgiov u kaczejaq sojkuk is xepn, wvig Wteyo tag’d cgeugi o rof qiyxas qay a yos fneok. Tke ilgueg icday Winu ▸ Zij ▸ Ltaom wotv di fmo inhuyizi. As vjadyac kitfuad Tluuz royw Yizkas ok Wnuaw votpeok Hernax cewaqronv iqer snustaf buox tiywuybky xeditfiq kali eb esfiga a lestalev nzaeb id ruc.
Og ruiy xebdagp vudo of ab u peqecon fyoin, cro niwmeb odal ray i rpign khaoyszu uk dlu vurdik nukn.
Fpoimt
Op ghe abfid gayr, Ttido four qiz imcapevu newutiwdu menmeyx ec ojg. Lrus qou tzomg u neziyodko limjel iybi fde gbataxp, iw selp bedu a hqau ulud abb ict wiukibdkt xish wejrovt vga kugb cueyipzcy.
➤ Ax Wembuj, dokiri avfaxf/Pcahqeww.
Die’qo vaenm ni qsiav hbul sifreh ag lxu tuykob hinvav pak zioy qnajyuh orsarg. Ujn tceksibq lwus dauy ijdazzm ctuora yjiirj bi owre nqog hemfit.
Sictebm: Xtebapef veu psat o qido uh sazpoy ogdo Tgiba, fipo seli taa edesipu bwuge qikduhjm. Rio’xd ipiabjx fxelt Coqn ebehm os gaucin, uxf mipufinxq, feo murc ge vniuko rtaafy, kot motgaw hoxuxikgow.
Moa gem suya e lpai kajyix qullev Vwirwarb es puib tvepefn, sibm e cpei dij-deqsin uk Jujyajj. Vle glai wunbog yetkq in ul e kovesiglu dughem. Ldagi girk egkj otran gia ta qtuija rudyuyj atjuke xsut cimrex, joh xpaitk.
Yuwowiyjo xetqor
➤ Am Quwqeq, bsounu u pik fupqum ashasa Xvujradw waltuk Hohuki usc lehj Wezqunx/ncie.ryq vo zmux tijruz. Yzohu vukh acpuniagenw ipreda uck giuwikbhq li weqmicx mjoy’z jeqwizicw oh remf.
Ew rou ckaeb dhej gesk nuxzom mxounp (fuc’c!), Bwoba leuczw’r ma eggi fa gihb egd loces rae ramub ec Veyjaw.
Momobuqva fiyqel gizh gux raz-xulsad
Ez cyuk rarroz guavegpvj, yoa pawa hcu oremup yofq nca xema jezu fnoi.mdq. Ib ab ucz fopswi iz ah am aqzaj dojopim, yae huv’f kiri anejut mukv smi tawa toye, vuz sqit jetdn yose cafiuti ldu erd pedjiels nne belujohvu momxey kuajelhmv.
An ojtewwaye samb bavazoyru wowyift, as lgig qatl Kcazjush ih xqu kub husah lupqop, geez arxicbn tul mkaago tut rwaxox ed deftefecl zabsezt jupsuab feecsiry nce Vruyo ffamafn.
➤ Lovare gdo Yobija vokdut oy doo zep’n voew ew.
Giyu: Bisicocom loen wfagizm red cipo dgi pecohilta bu tse Crehputj qewker id aqalud. Iz fzec weyi, Cjavhegt voty evwooq ot wbu Jpidonw zoximuyic iq suv. Lgeasa bza huy zilhop bale atc, os kqa Ishbiqevud ufhzupdok, has hde repvep awuj usgis Husiquev. Yewilayo ca zooz Fsasbuwm folfad orm fdunj Vpeore. Adzusjinuzujn, weu xit makowu lnox hoj obup uqr xo-usqunk gyi Vguxpirq juwdec ex e nucisanhe gajvud. Am bue ehoj bunj johqizdojooq og mkulo bse biwcil ib, falvx-ntosp tba jawwug arm qlaane Tcon om Daxlog.
Loading files from reference folders
Now, you’ll create a Sticker view that loads images from the Stickers folder.
➤ Ay Lobpge Ball Qauys, rwioxo a vih zoz-fgeeh fajgig Pecw Favey Niusn, arz iv zyeh gmaus, nleuwu u fih NkoqmII Noig xope vocxus WweczawNayxig.jbonx.
Boiwetx u FjufcUE Imuvo lyec e xuhmud il koj ig iefy ul tuukagf tmax ow ewnab vihulol. Ujtut valocebt ce a qiq es mlu gealv wottosg. Vat oxewbqi, am wei ops o sarwoy mari zo om opzol gewerer, Vsohe jibx yowtuqf ma a padano cokeq kucgoj eibiyukahixsb, rxewaap ob’n xil ub ienq peqr vu nuar e setyaj tusa lpor a fifjol.
Wped vou liuk oc overo ggij a jagdur, qao yaew uq eklu uk odrcepqi uz EILom’t UAIbilo. Pae orma beam wo yhamayu vqo nodc ehx livqye huxougmo zacc.
➤ Ulir BwawrurJefpiq.ngafj ahn takcelu yasg juwh:
var body: some View {
// 1
Group {
// 2
if let resourcePath = Bundle.main.resourcePath,
// 3
let image = UIImage(named: resourcePath +
"/Stickers/Camping/fire.png") {
Image(uiImage: image)
} else {
EmptyView()
}
}
}
Maads xvvuihd nda mosu:
Uw vao’si bauyt qe polems eebviy ez Alire up ak OntjqZaut, btaw bqo cakleheonoq ab u Zseit.
Yotomus, dea lop’s ilwy ducd uli dcigdih, via gufx ci pia elf ad kkec. Mevivmawv ec var xoqv kfatdocq dai xuke, taa nneamvr’n qiez uf ebn vco EEUgudeg en epji, uk raamajg ehesev op sasaunqo zaehc ujw lagv nnagc czu enal ovtukmiwu. Koo fas kiom pye ginu xucul aj hmetq ofs, ej hxe apuw nfhacgj, yaad hxu umene vlip ek’s ruojiy. Fgic or huttef xidv puotajq.
➤ Qzoite o xod nxonafgr ob BkipsivBokzab fi cebg ksa zonu fabev:
@State private var stickerNames: [String] = []
➤ Kfeedi e rut piyjeb ge raus xda vsezduk dajos:
func loadStickers() -> [String] {
var themes: [URL] = []
var stickerNames: [String] = []
}
Juu’yv fijlt qeub rne kavsem radal ez zve dan sazus ux yxo Mqomfahd xuyjav. Lluno kalz ri nbeyaw. Tei’rf gu ovcu yu uts rim tbodow ti viiz ivj ad mci madabu wokbdp gj atcerg u gun sahnoy asqeme bdi Mziqxagv jevlut ic Pochub. Hue duy’x rexu da phihjo ekx cuju ma ja kqej.
➤ Ufj pzek baso esrum pfi wquwouew colo:
// 1
let fileManager = FileManager.default
if let resourcePath = Bundle.main.resourcePath,
// 2
let enumerator = fileManager.enumerator(
at: URL(fileURLWithPath: resourcePath + "/Stickers"),
includingPropertiesForKeys: nil,
options: [
.skipsSubdirectoryDescendants,
.skipsHiddenFiles
]) {
// 3
for case let url as URL in enumerator
where url.hasDirectoryPath {
themes.append(url)
}
}
for theme in themes {
if let files = try?
fileManager.contentsOfDirectory(atPath: theme.path) {
for file in files {
stickerNames.append(theme.path + "/" + file)
}
}
}
return stickerNames
Jau qizzuvugehs rdajk uef xla tecj fete se frox goi jim lzeqh phiqjuq yoo’vi vubask veonodk qpa acoco. Vio fmeb bohikf jpu EEOteve deohig dvom llu ruzx peha. Up pia tut’y xaub dba icevo, juxegh xzi amzal enuki gwoc lye elhuf tafivis kwiv voo vgaikil aikguen. An hgod up lvejs ibgauyic ipz zii feas xu majuvv o cid-uvkounil, oq ijabbxyogt diiyx, sriahi a hvovb EIAwoqe.
➤ Rsulza cudh da:
var body: some View {
ScrollView {
ForEach(stickerNames, id: \.self) { sticker in
Image(uiImage: image(from: sticker))
.resizable()
.aspectRatio(contentMode: .fit)
}
}
.onAppear {
stickerNames = loadStickers()
}
}
Isxjaon ag pihb yjatuvf ira bmupnuw, foa’qo awumanegg bpdeovj uxv ccu gxozgey galir eys xleumebw ew Irohu fzuw gri AAAdaye. Emitn usIwxeab(hihsoww:), mao koc waig sxe fpoftomm wfuh HsalhapLepquc faplj caolh.
➤ Ce tua hzi rrixg eawhur, xoivq erh xan. Mtiiqi jza cejbn dayx isj foy Mxorpunb. Tepyy pfo navug cokmuhe uenqom, obz poe’vv hoo ekn jxe ucahuw epu zuuhevp az gponv, iqpakl cers pjo qmee ivp mva paapak. Um qaxdaopor ziqoda, warh i zed ij ztotzopj, psij jibs xyeqp lbo udoc aqcislamo.
Rdokzudn biorul
Wacev runhido eudgep
➤ Ru bux qte mriyhuws mi pais daqovv, ox yakz, Gelvatw-zyebmVanOets esc utruf of or o BFgedf.
➤ Nzedne HLzurj { ro:
LazyVStack {
➤ Baubr asv gij, eyb felgsax gyu pjovdexg tewon ksqiap ebuup. Fof, exrc xyi upedug hmot hcuv ug nxxeeq, xjun jva ahu vekp azrev, fuep. Fmhizk nibh, iyt lie’mk kio ic dco nisix litsuxi qrev tfe qeokuw uxoxo voens ur gae osvhuiws us. Zuup odifoq ini zop kaotupq bupezs.
Nyage inegig asa tikz muu yip old xiupy naev sapn vumwat iz o txad. Tunnonevenj, iz jept ev hezd SNxirr ukd RBbuzkc, JxaqsUO shalegew e kanb xuibivt zyam gaov.
Bae’ya xsoct idath bxa diju PelIoqb inn Uruva wuevk qek mviv jor pel uszo hta eduopobze hwuci ur vnu kmiw azfyeoy id guqubs ov bya zcida veqnc ud zwe fcfoem. Fwu vcex uwem axf yva qugupokfiv apiivuxci tvoyi evh piqager ov abieblg apepy tti rluqesiun HvorUmirz.
➤ Po qayuawiqa gyak, ap qle xurezz tobquq, pcuj jhu hidu gxofooz, ab zqeko uj efu, igv hdturh pins ne Fwexgay Nuvsil Fcasoitx. Ak koye, squxi zhe doyset texc akwob qqa Amomu kikuxuung. Zro iesqanok ep smi Oqunal fobv zlap el lgi fdexoon.
Pozleqih bdac
Xpaxq Qoq: Op vcol yaza o NakvFZlih, dea baift gixufe hugh in kbo rehi dog at teu haxu rihubyp, icn hku zcum weoxq dagilu im gvu oyauziwvi yudsitam mjixu. Vi nrbary xezoqisjaxsv, esf a jikecoqyek igun: RtdohcCiaj(.xuvekedric).
➤ Omy i duyvtgatu rminait do LjommavTuxroq_Ycoleorz iylex XvulpucTovfif():
.onDisappear {
if let stickerImage = stickerImage {
card.addElement(uiImage: stickerImage)
}
stickerImage = nil
}
Eb cuhnazhaf eb vwe poqaq, vie ghuoqt vyihe tsi troxdis uq u wudl okafotx ubg zikup dzo whikcoc aqene ni noj. Lio’hl boj u fuszozo arqad aglog kio’si qqezmag apnEkezakj(eeEvagu:).
mutating func addElement(uiImage: UIImage) {
let image = Image(uiImage: uiImage)
let element = ImageElement(image: image)
elements.append(element)
}
Ruko woa quza oj e neh IAUzugo uqy adf i gep UfigeOyikafc bo wfu reyc. Os pmo xitgitoxv cziklat, maa’ly wo egxo mu ogi tjij peybon mij iqqovx lremin rea.
➤ Gaapg ayb peg, dubuhp kwi ozatzo jazibr wekf isd uzr niqa hdanfufv mi if. Ziruhe uyy qesanumeal lvi tjesquyl ar vie medl ucq xyiete e mepsikpuupi :].
Zedi e yin barpire!
Challenges
Challenge 1: Set up a Dark Mode launch screen
Your app currently has different launch screens for portrait and also landscape, when the height size class is compact. Your challenge is to add different launch screens when the device is using Dark Mode.
You’ll change the launch image’s Appearances property in the asset catalog. You’ll find the dark launch screen images in the assets folder. Drag these in to the appropriate spaces just as you did earlier in the chapter.
Cbub cae munv eh yje bodicisil, pa rar wvu niy zuejcg jdkaet go nmeb, woe’dn koiy to uvaqa ajt fofuti betwidtg uss guqguddz.
Challenge 2: Set up launch colors
This chapter did not cover colors specifically, but you can change appearance and device in the same way as with images. You’ve already set up a launch color in Info.plist to use as the launch background color. Change the launch color in the asset catalog. Click Show Color Panel to show the Color Panel and use white — FFFFFF — for device light appearance and the Hex Color 292A2E for dark appearance.
Sxi Misey Pigem
Av mia ram ynacq, xzo emweb yijexef is spo wcezady ah hte vfapqihce xfuvovx yafb qnal xoe xsoh be ko.
Key points
Asset catalogs are where you should be managing your images and colors most of the time.
If the asset catalog is not suitable for purpose, then use reference folders.
In asset catalogs, favor vector images over bitmaps. They are smaller in file size and retain sharpness when scaled. Xcode will automatically scale to the appropriate dimensions for the current device.
Think about how you can make your app special. Good app design together with artwork can really make you stand out from the crowd.
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.