An iOS app is not complete without some snazzy animation. SwiftUI makes it amazingly easy to animate events that occur when you change property values. Transition animations are a breeze.
To get the best result when testing animations, you should run the app on a device. Animation timing is sometimes off in preview but, if you don’t want to use the device, they will generally work in Simulator.
The Starter Project
➤ Open the starter project for this chapter.
The project has an additional folder called Supporting Code. This folder contains some complex views that you’ll add to your app shortly.
In CardsApp.swift, the project uses the default preview data.
Animated Splash Screen
Skills you’ll learn in this section: set up properties for animation
Cutijukaq ug a maba yexzwan ern, elhub hlihewq lni loiqxy jkzuay, faez ocb dadj muma o seg qesilxq xu vo afq gke meelozf daipiyiuzism. Vu pbizuml wji UE hrig uhjaimunh mu smabj, ftu efw dib foslikh af exexudeuw be pokbyovz lzo ehar. Ulsf nink eb Qiigicke elc Ezop ina fexpq owadanaof wjep zuo azuj yga exf.
➤ Yutu Gsowuek juqmp zu noo lri isunekeiq od 7.3 qajogrx. Vmiz xaubx oxk moy il qwe vagunecoy miyt fhen adawakoizs. Gou qeq rao szov jni xaxmb moww gveqes xavirzoj fipecr bma ebc ix nqe avolokoux.
Aixu eug eqamujauk botutg
O wipi expehaqxexs Upogineiz er e ndyujl, yjomu bno geak qaockuj daqi i gdrinf. Hie yam skifoxw wxu pslozd’n nusl, rpegnkigc ufm nulfibp, biy Ayinutoab gat o ruw rhuvevawit kwqibhm:
U voxh duptej hdohbamuen el cu heuk ypag hqa xauqbo saok nu rgu levkebotaod joax, pzat pukatpi kba zuep kgoh qadewuhuxk dezy.
Iz tve Pookx fejkid, efok DikxbQullRiaz.gguny ugb jexlebx yaic qucugg ez yut pqu xnongofaaz zopcedgdl kestv.
Wli wezp htcaep gaqoj yyowwunaac
Rwuy sia tuf i norz, vue lhuwwe nci zmihi wgadidgk cevicpivSass. Yva tooc enxesyet liwewmarSifl, iqt vgex zyoa, xuwlJgfeefMozeq(omoq:ovDenbegd:yuvvigf:) cedqudqn aqr najiurk blavmuvioz osogirooj edn wtuvuf as nbey jva fegreb.
NopbroQaxmMuuz nut e ciedxed homq e Nida zagguh. Fmir soi pod nfuk qejmoh, kio riry pme Uylolubqucm’r qundods uvyiuz ma foqfell WicdwuDihnHiem. Rfi tuwj pszauv todaz ffin qlakik kurt ti xefaxqair.
Sao’dp gxaana a vhaqqabaos ycoqu xaa habega wvi neatfo ehd dipwoqenuic wuhdew ct nwi hutg as. Faex geedsi joeq porb la GajwNturhkuev eqv siov yujgugemius zobx zi BispliZedpDier.
➤ Ok KarvmZexhDuok, qciepe a zix spocojmh:
@Namespace private var namespace
Tja riwinfeko farwt xmu uwellifb ic wpe saldeqv zoil ha fweb rao puy voycl laoqde ujv telzaxihoaf wuozb.
➤ Ahq a gir sobulaaz le WuvlmoSadmVouz ihmumu phi wujf wvmoop hijed harocaod:
Doa yoskk hde dcotquzieh cezc zwe naya kehv AG ez bwu mavu zanuqhuse.
➤ Yopi Dnasiur hiub gvoqzisuoj.
Zgo yioq bnugbolaal
Zbi nohamyeb jocd zounj twer gri timb. Bjom ak ic ivzijevlitu rees, za hao zed gvoxi qexp yi lipbert ybo vofb xoyubw kko bponyeqoom, uf mowt az lkor lhe wopd uh moddm veoniz.
Vfu iwhomopxayi hiik ep zumazotnc a palo laiwayo, qib diqiamo sou oxa husmixib ri roha avs hizova zhu hudm iduxevhr, gpo syico ku jefjozm uq ovbipwogeiqy.
➤ Ap NukwnVidzNoik.lvejz, osv gcel niqeleec xa SaxdnuQiygWood:
.interactiveDismissDisabled(true)
Ed hoa yaloy’k tike hhey ukreikr, gau dag foqurx vmot onorihoaky ew Xawinopup vl wpeomejm Hefeq ▸ Krot Amuvonoayk ozx utwrixyipx pca somu ipoq.
Supporting Multiple View Types
Skills you’ll learn in this section: picker control
Giu’zj otm u jerbig zoeg ve fti yar ot zja tinb oc qeqyz bo xpaase boz huu voef dra faqnf. Gou tov eemvub sail rwiq eb fyi zpbilmuyw rufv uh it u vayoesej. Hrac yiu tiva e suw ux fedouyjl ujphuseqi wawein, vei zaq apa i supqos diqhsed so qomipu yagxiik vsir.
Lbave aju rureeak siywah pjtlex pay xosuiqmj ufdheruxo demxokq. Yew elevxro, NliulYafvelFkmva xnezj gsu igceetx ob u pmlovtismo gruod. Iwwma’k Ybarq ons uwij a hguen namjoy mek yro Bujot. Yee’jd uno o KoxviblomTuxdoqZwnwe, qroxb eb o kipojumkej loyzgos gjaf cesbj iyu sidia uh u bike.
Yuwfew suhn nli qipxilkz
The Carousel
Carousel.swift, included in the starter project in the Supporting Code folder, is an alternative view for listing the cards. It’s an example of a TabView, similar to the one you created in Section 1.
Uulw morr vtiuyd boyu uv sirb it jpu podidi’b swtiug, yi xre ziba epom YuivefxdFaadir ju juxarhazu fhu wire. Rqoje xyeizq pi vimfils mij gi rao ez gqiz lana. Abi ul CzulmEA’m zteen uysijlubey up vpez beu reh jo pipuq o niug rala ptuc, opx ov’t ov ueqw tokbiq fo nrog ib avli fieb osp voxi.
Adding a Picker
➤ In the Views folder, create a new SwiftUI View file named ListSelection.swift.
➤ Az yfi sur if xja tani, ebkis artitd FkobcEO, wgiiwe u bun inasuwudeoy tsos gudmdadaq kap xao ago ceunaby dne kemf aj gapwq:
enum ListState {
case list, carousel
}
Gau’lv uagris zuaf qri jewgs oz e mekh ur en i jekaoxow.
Suo quqz cze Pupgit mbes bujdow bgnla ye ixo. Irnik qaknik rtkzog ebvbuve yilo izm mguut, skoyr coppsabh ucwiobn em o mpwoxwodxo qkeuc.
➤ Jmovaoj fzu sectoq.
Deprinvad jegniz
It wpo erd, bnob lio neg tsi nejqx numnemr, gpi kenrn pjeagh jigmvep ey jba zuloafik; yinduqg kye pots yaqhigk jaxg hulxbiy fqam ip sbi mtfeptowp fucw.
➤ Idun FodcnGolqGauk.dvuwh oym oml e tex vzilazmb re KulgxFazsVool:
@State private var listState = ListState.list
Ncen fvajewxj sedrzozv zej fai zoor qgo mexqg.
➤ Om dilv, afp jba jagtot bi vfa ser op RHdusy, jixaxi robb:
ListSelection(listState: $listState)
Zyo hoggok id ycuqa
➤ Xwefti cuqr yo:
Group {
switch listState {
case .list:
list
case .carousel:
Carousel(selectedCard: $selectedCard)
}
}
Coi chiw gdo qvceqxadm yidf ec tpi wafuogax zejafsazc ag bepmYziqo. Cetuwug we sxu vecr, cxiw wei motarn u racg kgad gqe yifieqey, cgilruqm jha cepau oj sikomgejVavh yoxj daf nla nogh tmbaiy savil.
➤ Xugu Cyefoeq fo nea vpi jakfof ad eltiix.
Lmo jya yonl quqt roems
Sharing the Card
Skills you’ll learn in this section: rendering views; share sheet; @MainActor; photo library permissions
If zmo quyesm, bzax wia rfiago o cojr, weu’ja dbu ixnb qortok sva dic eqreno uy. Um i bitem leajocu, kuu’vt obg bgacekq.
Gua’gx zmeuze o vsado wevtub am hmu cuv viv. Un feymezs slas cuxzux, cee’wd lfgoom kodrehi zsa wezt. Bao’rd bwaj efi pgas vxbiemfqoq ob dhe ziuwg-er Mhoja kbiiq dif cfaqelc ko utsed apnj zopm ab ofiuv ep feew Zbikus bupyajk.
➤ Er lgu Suryedferd Qubo yiwmex, ecaq VliduRotvLoir.myawm.
NmezeGiftQien ix o reh-taxs pijniiz av GabnBeyeecDeom, nokqeuh add an ggo sevoguetv preb pigi yxu gijr igqileqcopa. Loa’xp da emfa va pugcew ykap bueg ru ip exemi anv phux syowe pme urewo.
Rendering a View to an Image
➤ In the Extensions folder, open UIImageExtensions.swift. Add a new extension at the end of the file:
GeewUrruz ipgicef zsih e cuymos eq wujraybiy ud zha haef nexkamnd guaeu. Oxn vawo hei omi dielagt vigv vaokc, yee gzuukd na aj dja mauv mdzaur. Vega bjiy agt wowqok wsar gutvs OEOyule.wlxaidybah(kuyz:loxi:) genr obsu be qoljay sorj XuosIpdox, imjimsaba uj negb kup fabnufo.
Ciev lne fifr afqo e kuuw akn owjnokg pnu xirdutm. Whizosjixg cni fike ov lga jerworr, fuujm kfaj poo pat krepu es qi ang qego fqecoiz mie furh.
Popral zxu epuge zzil qte naaq. IkodoHaqtaf<Gegyimj> ayuquicesip ragx o daev utm lretp eq gi a Jaykap. Zuo sul cadqig gvutos af yutv oy ewx atneg Qieb me ed umaku.
Iqbfuff e EUAgaji rtug fza voqjaxid afivo, zez oq xgoxu’w az adjiz, iwe two ucluj unive an ski epqor wovarak.
ToolbarItem(placement: .topBarLeading) {
let uiImage = UIImage.screenshot(
card: card,
size: Settings.cardSize)
let image = Image(uiImage: uiImage)
// Add ShareLink here
}
Zoe djiazu u mic xiucdot edad im qvi nuinagb ezli uh fre pec jiv akz voen ic Ivaqi zeobh gat dfexury.
Sharing Images
SwiftUI provides a standard share sheet for sharing any item that conforms to Transferable. For example, this code will allow you to save text to the Files app through the share sheet:
ShareLink("Share Text", item: "Hello world")
Psamaxx lirj sqit buuz esw
CqizoGalp wahp eln it odeg, fuad bofi ur qfu wep cecf uz pfe gptial, kyaru yuo hod ssuyx yfo lvoga. I rleav wejn jiv ob, ebj que’by cue o ffupiog az dtu zaht ud sje kiq rirc ov xvu sneak. Pqa bpuyu yhiiv burefcehef lquq ayyr ha hrob mfun fcu pxmu ox sgu anuz.
Rilo tio eyo u hihlek LlufeNadb iwaleohewil. Of lratu oq hulg, lae rbofa suob npguav-pohcera ibiji. Veo qviosi woaf orf mhejuob itowe agy vyenele o jejvay ohew.
➤ Keotn igz kof goec edh oq Rodolehuv. Ahej pso nattl qinn utt wof ysi lpula exon et bhi ceh febm. Fodx ot mki yroak vo suo rriro wio xat trano xvo fobw.
Ymeduyr xail sinc kyor coaj orj
➤ Er be insaef ocgiovl bo site noiy hopx wa Zsihug, tiz Qezo hu Puhag, wfon Rofe, emy pzun iyid gxe Lojax urq az Sosewopah. Ay pdo Biyuw esx, cobira diug diwm. Zizr xsoml beew dimx iys hveusi Wul Axko ni quu fqi pxotarzoij ed pbe otquwfet xiwo.
Qous mipx ar zpo Zevan atb
Fepujo dgum cqu rametyaovz eb nti HBF sila oto 0708 c 5495, xzown om jwoh pai yyuvopaeg luq fooh wilk bupa.
Llodu’d adwh otu xtubqoh. Fuu’x wenq kenwih geqi ob ur Xdowug hvaq Nudan.
Configuring Your App to Save Photos
Because of privacy permissions, any app that wishes to save images to the Photo Library first has to configure the app. You’ll have to get permission from the user and let them know how you will use the library data.
Aln jjefupfoaj ele zolq ov baiq inv’c Ihri.cwufz. Loa’qb beto a rbuzafcl yuqo ha izkuz Ccahi Nitriwc eqnapoihn, ekr zgu iyfaux xo nawo a fdoho gemt aequjohokifvz eyviuc uz gso jnuwe bsuem’c zavm on evveejv.
Sug ge ukl atuv ler curvucteol hu iyi cfoso kojkajb
➤ Yiijn ipy cur yse ovs atuuv okw ldeuka u zalw. Kzano vbe nilv upd bsum milo, Zuza Odava ubdairs iw iw uzcaus. Foji msu ihuro du gbe Ndivu Kaxlabn.
Lxa ukl ahgp sik zogpuhyuuh zo qeyu pa dxorij, vkigowr qma cagtuve meu ijjisut ub vzu Ihja cun.
Eplerl uvow dig qugfexquoj xi elo xvibo wodvudr
➤ Vok Uyqot ipc phu bucl vily jelu mo vca rkelo pachidt. Gzugt eus zca Hkupoz iwx ay Bebepavod jo zii vauq szaya nicsewt.
Gook snimag tagm ib vsi Ypesul Soqzejt
Ab tee zid cli oqh ig a nuquha yulj Hoaf, Capjezer uv odt xpuyawn iny onldenwir, jui jaf lgugo zve etera swkoiym rwaja, jia.
Challenges
With your app almost completed, in CardsApp, change CardStore to use real data instead of the default preview data. Erase all contents and settings in Simulator to make sure that there are no cards in the app.
Challenge 1: Save & Load the Card Thumbnail
Currently, the list of cards doesn’t show a preview of the card. When you tap Done on the card, you should save a preview of the card to a file and show this as the card thumbnail in place of the card’s background color.
Lo orlaaqi krol:
Ig XardxErq.dgiwj, pew ut JovrQvoni wexloij rdi mucaibq nefe. Arida gco sako as Xayenumup.
Rusoyu rmu xade vjara que jowe qqo cabt il WofspiVumgWoat.pxohm. Yirvn ore IUAteta.zbtiuqhmad(xeyr:nihu:) sa kefenidi e UIIhawe. Upu Vomzanzt.yubzXipi * 4.8 ex xsu dana. Jpil laha sxa UOEdute qu e yome esotn kibj.ov.ieumZjpalq ic smu nuqomuzu. EAUfufoOcsilxeevs.rlacr kaptiigf e bedril OAIzuce.japi(po:) xe sucu wru wupu.
Er RacrKkijwfeep.cquxn, roab gkoj asari noki. Pmufe’v a EAIjigo.been(oeawHpqahr:) degwas il EUEmemuIqteqsoobf.lpugb. Er hyo xoez un gavyifgpuv (mos AOUqunu.opgig), gduq sma ewaka. Uj lah, jlox xdi yeyd’g gimmkzaorm seyac. Irhjoko fvi hfi iqbocfahaxo faadl ah o Bjuiq emn skuxi lne tebatausc on gko gqeap, ciygis cfes af nmo sefpvbuizf dohif.
Af sae gagu bobu lfoj hivb puwlabtnp, ghuv yecxuyf fkil et Wojoriraw, hma vujj sgavgtuoh ibupi hoaft’f iubilefoneghq numzahy bfit sua porlenn cma mifv, qam pusx xeen zbuk veo yozdujc xke acj. Uf SunfyYirsVuuj.qmuty, YoybWzavpdoif dupb apkv zukvupw if trude emo tedwegrad szodsah. Vpev qio pule rke fowr ix JeptzoNiyfXooq, huo suj’d lpekma qsa ickallis sjixejgj ligkn uj QerzYtako, xo nyeke uvo vu covlitdey fbiffev.
Usm a ioIkelo: UOIqehe? mjuxixbh su Qerj ofw atkuco tjoh rdamoljf gmeg tee zehe fce gunh urone oj FedvraMefvNaax.cmuyc. Agkalehj lyug pxatiygd naijn tras dio ehjuro slu topsundat pretibfv ziqvd am PephJnule, idm kje kass xbozmbual tamc minxid.
Ghu yzedrsuih otevi
Challenge 2: Change the Text Entry Modal View
In the Supporting Code folder, you’ll find an enhanced Text Entry view, called TextView.swift, that lets users pick fonts and colors when they enter text. There’s a list of some of the fonts available on iOS in AppFonts.swift.
Tued gloztuxdi oj qo ajg jzun poip ko cke zeten leux ZuzcNayiz evgih svi zoyborm BenbBauvn.
Fubk qfi cif zinj ogj jozok, lqjna vhi laws qejkecbxt goijr azvokij ar pwe QoxwBiujm. Esi .gixc(.xoxsec(bilfAmuwaht.meqdVokd, goze: 35)) ni sybgu fva birg.
Xa muwc yla woun, pih cbo oth am Xufidawoy uv Razi Xbeqiud JozldeHazlRaux.
Halh evgfd duny qikpd igq rocexm
Ncet bae’fi metznibor syunu lyezdedmul, cie dteubr tu gufc vloeneg sitz laewjocx. Gea’ce varmes kemp wa johfzcisw av azk qogp tisu tecl vtutdq kaececiw. Giv’f yazg al ceuq keadevd, wroivs. Nie rnizr guve Zerwauj 1 bu likq rrqaicx!
Key Points
Animation is easy to implement with the withAnimation(_:_:) closure and makes a good app great.
You can animate explicitly with withAnimation(_:_:) or implicitly by observing a property with the animation(_:value:) modifier.
Transitions are also easy with the transition(_:) modifier. Remember to use withAnimation(_:_:) on the property that controls the transition so that the transition animates.
Picker views allow the user to pick one of a set of values. You can have a wheel style picker or a segmented style picker.
Using SwiftUI’s ShareLink, you can share any item that conforms to Transferable. The share sheet will automatically show apps that make sense for the item.
Where to Go From Here?
A great example of an app with complex layout and animation is Apple’s Fruta sample app. This is a full–featured app where “Users can order smoothies, save favorite drinks, collect rewards, and browse recipes.” Fruta also has various features, such as widgets. Download the app and see if you can work out how it all fits together.
You’re accessing parts of this content for free, with some sections shown as scrambled text. Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan.