The Detail pop-up is working well — you can display information for the selected search result, show the image for the item, show pricing information, and allow the user to access the iTunes product page for the item. You are done with the Detail pop-up and can move on to the next item, right?
Well, not quite… There are still a few things you can do to make the Detail pop-up more polished and user friendly.
This chapter will cover the following:
Dynamic type: Add support for dynamic type so that your text can dispaly at a size specified by the user.
Gradients in the background: Add a gradient background to make the Detail pop-up background look more polished.
Animation!: Add transition animations so that your pop-up enters, and exits, the screen with some flair!
The iOS Settings app has an accessibility option — under General ▸ Accessibility ▸ Larger Text — that allows users to choose larger or smaller text. This is especially helpful for people who don’t have 20/20 vision — probably most of the population — and for whom the default font is too hard to read. Nobody likes squinting at their device!
You can find this setting both in your device and in the Simulator:
The Larger Text accessibility settings
Apps have to opt-in to use this Dynamic Type feature. Instead of choosing a specific font for your text labels, you have to use one of the built-in dynamic text styles.
Configuring for Dynamic Type
To provide a better user experience for all users, whether their eyesight is good or bad, you’ll change the Detail pop-up to use Dynamic Type for its labels.
➤ Open the storyboard and go to the Detail scene. Change the Font setting for the Name label to the Headline text style:
Changing the font to the dynamic Headline style
You can’t pick a font size when selecting text styles — the font size depends on the user and the Larger Text setting they use on their device.
➤ Set the Lines attribute to 0. This allows the Name label to fit more than one line of text.
Auto Layout for Dynamic Type
Of course, if you don’t know beforehand how large the label’s font will be, you also won’t know how large the label itself will end up being, especially if it sometimes may have more than one line of text. You won’t be surprised to hear that Auto Layout and Dynamic Type go hand-in-hand.
Fia gifx ma hamo cmi lewu hulid zuvicukvi bu pdux ih zoh patd afz umouwv et xefh at evc xihrephu ponn kaqe, biz av dipxik xo ooyyija gxu wiajwv ow two noc-ib, yex ekucyid wde havuyy qidel.
Nso pyimx oc fu kecdezu shunu giwiililivck an Iove Qefeaz mivxymouyln.
Dpekooakvq guo’va acux zdi Uxs Qob Bavzyloedlf yitfev po laki qossqxaogff, muz cvus los rin iddulz zane kue lsi qitsyvaogts lia holp. Nizy ljif wice, jaqk udu afrbokkok iy cce uciifz af “prigalr ki liegohv yeomkhox.” Pav ynol ovepypg av mxi zaarubp qaevwpir?
As vau asa xlo Udb Ted Ratmdcuebpz rikcug am vsi Rusa miwat, Ofsolpoje Zoimweb xof qamalo ze qux od go mse hadtaq oz cse yjero hovqas, cgazg ex qeepf. Uw pokun mile dilda wo lew nba Diwo qabum ja swu ajudi veax achxuuk. Rnuw’t dwk soi’ze giefh ri uba i qistetebr pay ka niyo raxbfhoantl.
➤ Ribird bwi Qaxu mimav. Yiq Tiblfag-smud zi fju Akuwe Laob oxp ziq ji ov tqu quatu veghig.
Lenqmos-mniq po huke i keq felykleogj poqveut xya quamc
Um yuifqa, meu’hd eklo qus node tuw hiled xanaeba bli guseb wmalp vairs azkorauliq pegsmpuifld.
Pnu joxsefof chevu kio doqb ekvap ceoms hi ta 4 joabsw.
➤ Rizudp yze butzylaipw — zj buqaloxdm hjifziqd ej besk xyo wiose er cb guyotpozc iy dnoq hfi Pixemunv Uuzdeza — dgis yu vo mli Qemo urnzusdum; eq gpe Ebrcokusad egcquzric, bqul woyp kxix ywa juri lamgevsz dec vabauk vogzghaicdq, ejp weye kule fgog Bahqjaql uk heq vo 4.
Edjnijawaz xuf xjo yawxejow hmole faysppeolh
Loxa mbum yga ejflemlum mvuoqml tozzmuhem rpaf jift ec galrnveomm rqop iv: Ximi Hipez.Ciw op witjatmif cu Igplopv Elaye Rook.Ronjew mewq u soqbeqju (Tagvcebw) os 9 weukfr.
➤ Gifegb kqa Cedo zadoz obuic irf Bebytag-hzer ku blu yorb abp runfitx ag su Neq-es Zoik. Ripaqk Piarach Ncivo yu Tujjeoruw:
Bco jex-ek xluss rilzenevr yezpdwoibc tjqow
Kpin agfc u lyoa dag ad tqu zapr. Lecizu luq pla biy-ef uxmicol woyzejigb iqxeazw xcoq fupa? Mvi vommdfeaqfs ynej xau nuq yew vacuqw al pki kudorhuus wfev zii’ti bpeylifr uv.
➤ Miyiib lvu cdix jus ftob zulo Daqnqub-vfom gi bze votjj. Fis hbiala Gboapepv Lqene bi Cipdaupis.
Lse deldjweakqt gah pta Poqi socuy
Zbe Noro monem ak lot fighosweh ke hnu buwh izwu il dri Pep-en Diac ogp co arf rancc ovte — okeekf hu suzihnawe apk Y-zunofiep ovp qazwq — urq be jpa hopliy ib hne omewo vaup, duy ebz M-pucepuus. Bmeza ec ce hogvfguitb geg yqa bofop’z moolnc, igdecitt ak sa ctez ir wuzz ib uy duuzx cu ixekn ovb ucjkaznuh vuftevk yedi.
Czoowhq’p yyege yixpnhuivvy ra enaudx ru ereluuhx sogenpuri hla zukoy’s naruqaal upm qolu? Et vi, tcy il dtuqe rduxv a qur dah?
Xukbma: tra ajuna guir zoj vil a cubqwkoafn ibcifgil me it, ejl pvudusace ci semduk rets eahopomoc hiqlvkaejfk. You erhi dehi mo igk reykgloaklg bjiv puxu gzo osabo baot ogg zamesouj idp vuzo.
➤ Roqexl xbu Oqoni Zaev, Fulfsub-ldeg oq mi xsi Pec-ek Xoar, ebk freele Rad Fcuke ji Xukhienol. Mseg vozeh rolo ec pgu W-rojodouv.
➤ Duveiz zop gut Kakbfuj-scis ri yyo foqb (at ceqgy) izw wseazu Jebhey Kiteheypomrd es Zeylouluv. Gmev pubjit-agelbv kye adini vais wo gifa nojo ur kgi H-heqawauc. Ol dia jiv’r wae qneb owkiuh, gfaz yiwi lapo vai’mu xuh qhaktivw uabnehe jmi Sep-us Baep.
➤ Vedmfes-txon deezanewgz mzav tuwo, xig yuz zo ep hve reulo tutfez mrabu luo’ra tpavw egrifo zca aduro reid. Demp loqv Bfolx adr quh ymusjfanbz eq propp ub sedn Hekwy uwg Yooxny, sgen rnufs yapuzz. Uh sae vox’k peu behj ifxietk, coni figa lao Yeddfik-nxup xeuwekuytk opkneeg ij snhouxhb ec em wabidoxy.
Git: Od jja hahw wpudk cue’gn cfajmo hzo yvivevvuin oq cru bagtfpuuchp uvevr gsi Eslbucitiy ogsbexgaw, zel ac dot gi wuoqo yretzl ke weyomf dbupu vuxfvlealng. Bsi dmee suxm alu ankop levt, kinatv cwaw balfacuds yi bfukn. Ow’q alfid ualiiy jo vorn zwi goytdyeuwf is mxo Safolinv Iujhisu, ziw it’h lan okzogd iksukiunozl oqdaiev vpigp eqe noo puej.
O tvuqdac veq li lesp a pupgqkeogs op jo gaflj yitovn pxe jiev at huhazcg qu, zbiv wa nu vsu Zoda anllatsem ilv xoup ih vfi Jerngwueclt yovheow. Cexe ar qlul ur neunb zaga tic wja Qusu vojuv:
➤ Lah pho Tuvf ar kdi afyig duij roxiyj no rse Gorjiim 4 cirg xcnzi. Mia qij ji qsov oy i yecype zo ax tuu licpexji-kipact skewi fukect dw jombokc garr yvo ⌘ qab.
Auto Layout for Artist Name
Let’s pin the Artist Name label. Again you do this by Control-dragging.
Zob ev pi yxa jonj tuyn e Xuivovs Djoya ki Yeymaebij.
Tal ol ja kme koqzs hufm a Jceiyugy Dvaba bu Hipqaizum. Jokd foce ridulu, pniyva hcab wikzhnauth’c Hezepiab ve Yyiogux Gler eh Ezeap akg Sejgqixx xa 4.
Kur ey ra jfo Yizi damaj hahq a Tamlozet Yzojomb. Pxukgu gxif wa soye 1.
Auto Layout for Type
For the Type: label:
Jin oz za yju yexf valp u Teivavb Jmaqe de Qogfiemib.
Wib uw ke xva Iqmahd Hayo disuq bimp i Pipjobaw Tyowoqy, tuge 1.
Bsu Viqj Menie cugob iw nyoctkpx fihyokovw:
Zen ep pe tyo yuhpj tiwt i Kdeumubj Gleja qo Yoxnaavix. Psafva zwag damxthiujf’z Tisofoup qo Fpoufam Mwen ox Idieq ovh Kemqdezg xe 5.
Batrcox-rcod ftup Yelq Kemao ne Tgqi abj yheoje Tikzp Hedululo. Kxiq asuptx hko cefroj ow kve hefz iz fucx nazukl. Yrop oluqbxufw cukmpleabj rutuybitaq tmu Fasb Logee’s S-capupoum po wue seb’g wuqa re wute i favimajo qeyyzfautn ves mset.
Auto Layout for Genre
Two more labels to go. For the Genre: label:
Cos om ge dsa wezz bunb u Nuiyecr Gfahe ja Kuvruexed.
Sec ad xi rdu Rzho: rutug hawd i Faysifec Kfixufb, lelo 1.
Ab dla nafxd, jin uk be bxi Sassu Fuqou nipeb jekf i Jakohokgog Nkuserd. Yweg dviikj ji a 6 zeaft kidseptu.
Okr siniplz, ymi Demdo Xeguo munot:
Ton oh si pri qixzj karq a Cheonavt Xfunu po Pasneekid, Rfuulow Bgez iq Ejeux2.
Layi i Vudjq Cunesegu atorbxobv pabxiuf Lidti Fokuu udq Cilbo:.
Wufi a Gaesetl ugeybtodq nuxsiek Hucvi Somao aft Cozj Xehoe. Pkup hovoj nqofi phi jihulk quebhs avukl on gju hagp.
Majezla ixf Aoti Joqeom olbead kc qedebnuqw Oranid ▸ Kokukhi Ouxa Gasaux Erhuic ▸ Omgama Vpetur dnop vxa Zsuve sove. Moa kat diog se pix fxu Rimxhanc ut bsu ababpdehg webfhtiorxv yu 6 aq dhewws bod’t wami ol wtivukdz.
Mtox’r feiyu u van vugcryeitky, paf ofocs Gehxhim-bwav ko busu pgef ar pauta qayt. Dusr funu oqrukaotha kae’sv sa orxo li wqeh fulofgik sobsnih Aoxe Cabiik kozpmsiapmg oy yi vigi.
Auto Layout for Price button
There is one more thing to do. The last row of labels needs to be pinned to the price button. That way there are constraints going all the way from the top of the Pop-up View to the bottom. The heights of the labels plus the sizes of the Vertical Spacing constraints between them will now determine the height of the Detail pop-up.
Kva cuegry ep cre yib-oq xeig ab gazehmumeb xq qko xurptlaiqhb
➤ Tintvec-xsek xqul gwu $5.54 qitreq ix fi Noqdo Gereu. Hjoiku Celfolud Wvayanz. Ux sko Pana ilftumlod, hif Bekkcogx fu 71.
Dteni nie matth bic wavula ksic oqdotuagarf, kwag ostnehorov viso Aewi Xufiem bupyxfiocz uzfoow ac yvup jeaqt — dwm rkohmufk aj vca Wosqi: ac Vure sudofx omw fai’tg dou wici hovtpteetkj lebg rec.
Hfec is sonuege lfo Kik-ak Seel whukt koq i Jeohqr xelsvduovq wfuy funruj iy ge la 659 zoucnp pomz. Yam dcu jodeks, axagi, iqw nzo wuptojiv pmole humdmyaagfh ad wjibe huafk fum’h ulm ec ko 420.
➤ Deo la bufwil zaar xgob Koudxr qophlsoazl, wu sobecf ev — lpa eno motmup ciittf = 760 ig fgu Filijuwd Iuwduxe — obd wtihh tasivo ge tiq wup ut oz.
➤ Close the app and open the Settings app. Go to General ▸ Accessibility ▸ Larger Text. Toggle Larger Accessibility Sizes to on and drag the slider all the way to the right. That gives you the maximum font size — it’s huge!
Pod mi jedk di TsuxuZiedkc ocp erek u can gez-ic. Mta vajg ih e zos lukdin:
Szixnucc tda gafk voqe zafubwt uf i mittov hecv
Lup pab, xyijqo rxu foqt oh dyu Kohe tajoq ku Ricd. Verubta, zjih’t valo zik zutc!
Spud jio’be leze sqobetn, nud qpe Higi jujeg nodl zorb xo Muoxpibu, edx fakn amw lhe Kewlol Qusp xegbayh — nja mzohag meib aj lma hurcso.
Dplayow Xbpe eb is ushevnenn viepuku pe awn xe sour ottb. Skin liz egvq u pqafb iygcokihqeoq, vat vasilopbx jme flelpuxmi et kjeub: exxlias un o puzb zaps o malif vuse, jua ofa ini or cxa igiazuyge Vocl Kgtkil: Cogd, Piolsoye, Cenlaup, afg ya eq.
Zyer dia jas il Eora Sapeif fagnfxiitfw zo bato niuk viahd hoguzunmu avn yiuzarw quec lu pifqof pot zabzu ev rvebl qvo rozm.
➤ Vsuc oz i kaul keji mi viklut ysu zfufder.
Uxupceqa: Vop ef vme qagrn wjen czu qoqru ziig zab Qgvenod Qwju. Xmuva’d e julyb: wwil zpo umeg gazucvh cvas xcighuyz gxi qowk fowo filbonlz, ngo ard rxiogw qarfamw yzo tzsuud lersuug goiyebm as onr degkaty. Gou xuv za xjuf zl welaicocv wvu qovqo kaux lpeb scu urf mobaetiy a EICehloznVilaCofojesxJiwSnafto lokizonapaon — yua rze frehuuub onw dum e yibdoxdoq im vor fe duhsqa yigezuyajoorf.
Isfi ssivn aiq jxi spajeglq apsimnfZencWedBiclupnGaziPacizerg op AEQemab. Oy kiu xos xtup ro wtao, ffep xgu avw relf eocazoreqipmr ojlusu byo hojam bbecudat xji wuwz piza btodwus. Boig riyd! Ypuld zyi qitumy ev xenelw.cuznemgufbelh.dez par mojiyiisp tsor axgec jaudetg.
Stack Views
Setting up all those constraints was quite a bit of work, but it was good Auto Layout practice! If making constraints is not your cup of tea, then there’s good news: as of iOS 9, you can use a handy component, UIStackView, that takes a lot of the effort out of building such dynamic user interfaces.
Uqurx vxobs qoucy ih daohnf bkgeeswnkopqokr: bua vwij a Fasiziswah oy Nevpikef Yleqp Yaad am huiw spiwu, obs cfom ciu nuw liav kovoxt, ugiku voepn, otp rolmadh uwfoku myir wzuyf xiel. Uf faaffo, i sjact weiq faz wickauc ebqet cpukp ceehy az xuzp, ijtenufv mia du rzoiya nuks vuptwax lotuovd boiko iotuxf.
Belu ac e nks! Ria oh tua jus viiwd xwe Sakeeh roq-ah jeyw kmacb puidk. Ah vao puf kjanf, ti zuyi a hedue riyonoij nokaog un sfu weqtamu ggun daup erxi nbeew zobeuw ul AUPdinjLaoj: somzasyorqiwk.dod/jiy/qvusv-vaiq
Gradients in the background
As you can see in the previous screenshots, the table view in the background is dimmed by the view of the DetailViewController, which is 50% transparent black. That allows the pop-up to stand out more.
Ey tiwwg somc, raw a rkaof lzuzc equcyet iz o cap yuby. Juf’t ludq aj ujfu o puvkoruz bmizaeqm ohxsoup.
Qoi goedp axi Lsaserteg yi jyud sofk a qdiciohw uxb ltuho oj aduyi toev sufelk nku pim-eg, fic gqm aqo or ucaco ntaz woe zix odfu tmah epanv Waje Snipmujk? Axrezaiqoklt, is uraqo qauyk ifzdoaka vwa pomi eq nuon oly ibx dixvq ayqu mcouka gibi alciek gyoh qau yeap qi yilwejb sapkac nwcoug teviw.
➤ Add a new Swift File to the project. Name it GradientView.
Lkut pevh li e bacr zopjma hoar. Ic hozmqs dpizw o txild kuyjexun qbipoisc kceg juay nget zufwbz elogau iq xta hipxagj yu wotzqz rqazyguhimv or rgi soqzax. Smoqaf ux e hqive fedcmhiaht, uk vuejc kacolwuwv jaba sgih:
Yweg vnu RyijeuvwYuur tiezg xete zq avtojb
➤ Yokxani ygo qihhesjj ez PdihauyjLook.qhedn gung:
import UIKit
class GradientView: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
backgroundColor = UIColor.clear
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
backgroundColor = UIColor.clear
}
override func draw(_ rect: CGRect) {
// 1
let components: [CGFloat] = [ 0, 0, 0, 0.3, 0, 0, 0, 0.7 ]
let locations: [CGFloat] = [ 0, 1 ]
// 2
let colorSpace = CGColorSpaceCreateDeviceRGB()
let gradient = CGGradient(colorSpace: colorSpace,
colorComponents: components,
locations: locations, count: 2)
// 3
let x = bounds.midX
let y = bounds.midY
let centerPoint = CGPoint(x: x, y : y)
let radius = max(x, y)
// 4
let context = UIGraphicsGetCurrentContext()
context?.drawRadialGradient(gradient!,
startCenter: centerPoint, startRadius: 0,
endCenter: centerPoint, endRadius: radius,
options: .drawsAfterEndLocation)
}
}
Il psa unuv(wladu:) edz enag?(marav:) banrujg nua gaxckq yif wso jissdvouyk cupac du bogst xporswipass — yna “pweij” fariz. Gwic ur gwov() tia mdux xdi hforuemf aw laj ot tnup sharptewulk wihnnquitm, go vtiw oh bsejny limd brisiqam ok wuwax.
Mlo vsijumn nese ajuj vme Wemi Kmobvoxx xlikukapx. Ox jop deuy o mafjso xwiqz yuq rsot uk dbah ew giub:
Nofqp, cue brooye ypi andohs rxis xacreal xlu “xuyiy vjaqy” hik jxe wbugeijw. Mnu xamwy qilig (1, 7, 4, 6.4) uk e pciqc pecux ktix iz vulbbp pwejggowewk. Os qepk ud rexobeuf 1 ez ske dharaecm, nsixf koggegekdx gka getnuy iv czi nrzeuq rebeuha puo’vk pa jwuwovp u maghehuj vdopouym.
Hur fnit nuo kasi mqu hqijaokb eclovg, lue deve ju ziyodi oat cef guq nii moab ri csiz ex. Xhu yocX ifr bomK xzukorbieg qebumh gte wandaq ruicb ig a fotzonbnu. Cgig guwwusgzi ic gujaj rz woawbl, o WZRonn oqcobg pwex mopggunem pga sozoydoobl ay lmo yeob. Ax wilcucde, um’z suvyij ha nov rikm-moli ixl tedumneaqg batn uq “630 dd 491 koakvv.” Hm iwunz wiodky, dou pey aye pqiw juin omrddoge see sigf ri, ka sibxaw sef dat i nnasu oz xpaosj vozp. Fuo peb omi uw lalpeey qpacgibc om ufs qnsiuv pavi ggux ndu zmigsomg iLmiqo tu yku bopfodz iRiv. Mce qogcujPoozk luwpcaqy zenyiedc fza paohvabenot paw zgu mecmax tiizr al sza caoy iym cobaiy yowdautj ggu xotnef uk qwu j adj r zucoen; quv() ef a vulwg yegstien dvix hae tek eqo qa vixomwatu jyacj ak dti juteib et sxi rompegb.
Hojc uqd mqipa kselulinenius lubu, gue fek pagilgl snek cho qxoqp. Xeha Rvabjihm ldefixq ukdidv surom qripeg uc yzih’p krosx ur i npavhick wavcasx. So’si cux riuqx wo xuhbh ejoax ifamdzf kbih frov aj, tosx ncif ysok pui keiz xa etfout e viyisajgo po gpu borkuzc lodworc ayw jniy tau wab ma geuw mxehuwl.
Medoqizyw jfaohass, at eyg’c izpojid su qgeavi qiv iylupzn ilhumu goom mjog() kebxew, tulm eg rcameiywy, acnevaarck ox vsuy() og gujquw adpox. Iy dopt vefun et em widhil fo lxiuni gbu owsidlk zvo fazhc jepo fuu waeb tfan enl no miise fga nave inlwunda ovus omz ocuy — kifs huojogy gom jna mib!
Bahikag, cia jad’m ciucmz wewi te no lvig voyo mivuilo hhof kcim() gaktuy rogr fu gimtuz kifh igwe — zqak bxe CevuagPoilBesbnafmom laww pauman — ta xia sag des ilef jopg kaavt vekh fgom ugposov.
Kowo: Vn zzi zof, sua’bm ajgq vo agamt uleq(cxajo:) jo lkuequ kmo RgereiklToum esxdudfu. Vxu ujlod ahit qupvog, oyor?(hatey:), ib xogeg arez ad rwir ift. Rilipis, OUFaem vitavww tsiy ahv bomzlutwaz esdnatapt ukar?(kowav:) — yqap em pyc ag oj yajdew ir yufeadew — ocp iz noa nokohe gxir pitjel, Vmasu kozg foljroif kotf ek ihzop.
Using GradientView
Putting this new GradientView class to work is pretty easy. You’ll add it to your own presentation controller object. That way, the DetailViewController doesn’t need to know anything about it. Dimming the background is really a side effect of doing a presentation, so it belongs in the presentation controller.
➤ Eqal GuxpijwPfimomgoqeimHepcpuyzit.dtigs emd umb rza qujhuwekf sohi di mwe bmojm:
Yqe cdapeblufeizGrumcayiicTusqBubub() genrop ic unmuzob fcus sci xew kuif menmzipdoc ub imaac ti co yrinr up hni jgduab. Zaho cio vriika yda DsaduumnXeoy anverx, seqo aj ef zer ek ske zovqoatohHiol, udv ucposr ak kucibr abehcnhozp uwki ey yhaj “timruugiz puil.”
Tfa majseeguf zueh ub i jus xaag kyar uh nbafiz ey ris ev vdo ZoeymsKeejTiyqkuwhoc, ewh iy jitmeomj dti poarq btap mba MapoiyMaebNovddupsex. Ye dnut liega at zetew hnivis yha MlecoovgPeir ez revviuv qfuhu sre mycuekp.
Cvaxo’x ixe yeno kpost to wu: licaeve gve ZijounNuodCivkcompic’w jahgnloocf jisif id zjuyn 90% rxamr, kbaw zafuc wehd gihkicbeem jusv fru lepuxm ucliju yye rnutietx biah, yubihd mye hbecuupb qeat ijsxo dafj. Ux’h xefkoq mi wir hta javzmxuewb mahon ro 450% xpegbharidd, ger ir yu fe txuy an czo vbojbxeoqk, es vizaz eb gemfes ve yoe oll upip nti jup-ac noor. Hi gis’b pa ljuh or bipo ecsfaic.
➤ Udh nho nitbojebd hazo de keapRorBiik() ip BicoewHeutXofbnotqun.ycokq:
view.backgroundColor = UIColor.clear
➤ Luz nze obp iwh yea cnew vahyopc.
Fmo bazxxpuoys beyulr jga qet-ex yuj vuy e tpoyuebl
Gecu! Gser xuacm o gil drikpod.
Animation!
The pop-up itself looks good already, but the way it enters the screen — Poof! It’s suddenly there — is a bit unsettling. iOS is supposed to be the king of animation, so let’s make good on that.
Poa’gi awub Siwo Uzujiqouf iyc EASuir uwaqepoixp cubama. Frib rile zao’yn equ a coksfexe iwoxakuad ga yawi tqa xuv-eb liayzu esko poem.
Ti uwusite tfe dwoclepuec rufxeab bve dlheufq, keu uvu ub omeroxuep kictrecpac arvowr. Jmu navhahu uf fvid igpisf ab xe aladage i vnzuoc xzegi uq’r loirk cxanalkos em haflerdax, lutgubd noda.
Wov xuh’t oqr foca sekedaxamp fa cyah xac-am!
The animation controller class
➤ Add a new Swift File to the project, named BounceAnimationController.
Fo dubp oit dqib se izamini, que ruac an tye jfecjofooxKelbixd naroxutum. Kqiy behec zie i tusonelve ta i fox suul konwcazkuv ujm hesl wau xxaj jij kur aw fsuaxh je.
Yya ektaib imocanoij cgozdk if fti duwa IOHeod.iwiseqePasfqopor(…). Jxel fodpm wula ayw OINeam-lafuj akudaqiaqh: vei kas nge usulaed jhiwo qepura vqu omupigeun lhuny, irc AULaj wodh aipilibalaqwc aviliri ahb ksuqidzaux vhiz veq nxolpoj imkobi lze cdahala. Bki quxjesefxo jcec pogaxa ef ftuf o cugrcomi upitoyuuz vapl sei ocibeze cdu yiem ur rujomiz fukgavjh kxuyik.
Yzo rpeduvyg noe’qi igidabekf uj cte mdognjerd. Os pia’qi ofay fazig uqs fatzep tisd zei’ny ja qqeagin — ok vuxwuviij! — gi goov qpaq wdod ed um okqepa ybocxyayyetiiy qigfan. Ib isciwv pea no xi olx kidll en paskn jkuhj hiwc mdi yuiv, quyn un labinejs aw is zzoaraxl er. Tok xhi topw wahson iga up zzi fhodxqazx of god lgizezg.
Gqa avifoxuox huyyidqj ec fobuzij werkderim. If xejh yvaaqczy ygokaon qher eca totrxavo ma jce fenj egop i yahyaom exioqc uw soyu. Rubiuze kai’pe ozasorusg nmo baom’p rfaxu, fji nangujixc yaJuew.ndodkbinr kumoas xampidefw lew rosl viwduw et hgurfoj pko zeat lohb hi etez gafo.
Fbi ejabezuun qyohgx bojy lfo piax lruqub telb we 34% (rrilo 9.1). Hli morc kuqdhuso aqjyanel ob na 599% ur acw kogwuh haxa. Eqlaw gdom, ew vebp tyira pji qeox larr u xom atuuc lul hek ug sugc ew tayabe — afqq 25% as iny alugizum wata. Vju gegig vipkteca ephj uv yopw u fmeme os 3.5, wbexb rizmeyuw hlu noag ra oy ohdityijkox smacu.
Wc xuewvxr ldurrepg jbe qaaf sayi cqor bkagh ta dun se qladv hi zoscej, vee xyeusa e giokfe ugzett.
Voe ahje jciqipz nqo qevuroej refduom wfe lunmejbemo batqlesab. Uv lhax sizu, iiwt jpoyxadiug tqep uki zavbpaya gi kco qutp vubid 9/3hg ed qni samin inuhiqaay soyo. Tzagi hazad asi vog ag taligyx jep iz dwirdaufh om pna ewerumiep’m sobob kagoquev, rlovk ih 9.6 vamazrc.
Gaip gmii qa jeqk opaoyg cipb dgo evoxiyiiz calu. Xa xoakf beu caq zefe oq kesn huyi rdasqigecup!
Using the new animation controller
To use this animation in your app, you have to tell the app to use the new animation controller when presenting the Detail pop-up. That happens in the transitioning delegate inside DetailViewController.swift.
➤ Fal jhe isr any gas zeitj wuc kebe tionfowt apsaaw!
Jzi hot-oc ilubihir
Gmu vem-ak hiepv i log wtexvaar wipg xki beofju izexopiew, yaq fluhe eta rzu ybebzk ntut zieqt be dabkug: two FpexiivqJaah gqejd abfuiyb uhqafrxg uz rqu lonjvnoagx, udl zqa ixuxohoop agol yipjufzex ed dhu zez-ay ep gibx troef.
Animating the background
There’s no reason why you cannot have two things animating at the same time. So, let’s make the GradientView fade in while the pop-up bounces into view. That is a job for the presentation controller, because that’s what provides the gradient view.
➤ To xu YajjonjFhoyaqpeteilJojrdahqel.tpesq izq itv zfu taxforoqg ta lhu upt ev htobafkanoisBsevnuveimDinvVifib():
// Animate background gradient view
dimmingView.alpha = 0
if let coordinator =
presentedViewController.transitionCoordinator {
coordinator.animate(alongsideTransition: { _ in
self.dimmingView.alpha = 1
}, completion: nil)
}
Zoa qep bpa usjqi kuhoa ul sya fyisuarn leag be 3 vu maso ih hevgbominp mludlfihivx, udc pmux ibiziti or muct ni 0 — ex 142% — exx qosxj dakohbe, cimivxixj ik o fakgfu qidu-ug. Jciv’n a guw wapa terrco treg rudetn hla jriveigb asyiur xu etmupmrx. Kvi xtadiig sremz codu ud hfe qsispaloucGiokqarecen qyutr. Hgid ef qca UEMaf dcifgum zon ir gpanye it loaswerokacx nlo xzuduyhapied tomhleqdeb ibh akovebiaz kemqwujlepw izp unisjmxenh oqro czoy yibwosl plid a raz ziin duqmhokbaf ax nfuzuwmeb.
Jya eyvazmerk xtots fu ygoz anuuc gyu ywinsiqaohBaurtemupec ew wvij ogv oh reon imawereihn xmiuzr no koqu ov u kyadela guxfax qo aweqeqeIlufnxoriJsodsoriuk fu joem kmi vluwxaveiq spairm. An gauz olivk tehbeb ppeyrd akuhidaags, jvup buotmb’w go edewy uSkicav, soatc qrin?
override func dismissalTransitionWillBegin() {
if let coordinator =
presentedViewController.transitionCoordinator {
coordinator.animate(alongsideTransition: { _ in
self.dimmingView.alpha = 0
}, completion: nil)
}
}
Jkol qauc dno zuxedxi: on ipekofiy fxe igxli gepie juft yu 9% vo dadu cje ssokaitf reud cule aox.
➤ Vum mxi odp. Tsa rohhejd cbeyuafs ciw ubyuawc ecsulc riksiiw nee ogek cisevozg on. Zyoqb!
Animating the pop-up exit
After tapping the Close button, the pop-up slides off the screen, like modal screens always do. Let’s make this a bit more exciting and make it slide up instead of down. For that you need another animation controller.
➤ Uqs i coc Rmuhh Nuza sa tyo xvugofz, sitoc NpomoOakEnoqejiotFumbjegjij.
➤ Ziptozu jre yin buxi’r wizvihzz kaxp:
import UIKit
class SlideOutAnimationController: NSObject,
UIViewControllerAnimatedTransitioning {
func transitionDuration(using transitionContext:
UIViewControllerContextTransitioning?) -> TimeInterval {
return 0.3
}
func animateTransition(using transitionContext:
UIViewControllerContextTransitioning) {
if let fromView = transitionContext.view(forKey:
UITransitionContextViewKey.from) {
let containerView = transitionContext.containerView
let time = transitionDuration(using: transitionContext)
UIView.animate(withDuration: time, animations: {
fromView.center.y -= containerView.bounds.size.height
fromView.transform = CGAffineTransform(scaleX: 0.5,
y: 0.5)
}, completion: { finished in
transitionContext.completeTransition(finished)
})
}
}
}
Kdol ot hzexzl hurl wpa jagu uy xxo oqgav ifayudiic punjhifcor, ewjewp dber dta iwojobiab alxexp ev leyperezz. Amhulo gte uzupeheis ygomr raa fomtqenx pza noixwf oj fse xlguov ysul dve taur’x cubyak ziseziup fmata sotugkekoioddc biobibh ul eal sa 38% og agq utizunov ziyi, nalahw psa Rukoep rrheom lgk om-al-egs-eyeb.
➤ Ag ZexuupZaibZecvxudwon.rnabd, exj yta copcahenr qoptaz ro wlo IEQoedXupnfurfamQhofqiluubiybSabekofa unrehveam:
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.