So far, the apps you’ve made were either portrait or landscape, but not both. Let’s change StoreSearch so that it shows a completely different user interface when you rotate the device. When you’re done, the app will look like this:
The app looks completely different in landscape orientation
The landscape screen shows just the artwork for the search results. Each image is really a button that you can tap to bring up the Detail pop-up. If there are more results than fit, you can page through them just as you can with the icons on your iPhone’s home screen.
You’ll cover the following in this chapter:
The landscape view controller: Create a basic landscape view controller to make sure that the functionality works.
Fix issues: Tweak the code to fix various minor issues related to device rotation.
Add a scroll view: Add a scroll view so that you can have multiple pages of search result icons that can be scrolled through.
Add result buttons: Add buttons in a grid for the search results to the scroll view, so that the result list can be scrolled through.
Paging: Configure scrolling through results page-by-page rather than as a single scrolling list.
Download the artwork: Download the images for each search result item and display it in the scroll view.
The landscape view controller
Let’s begin by creating a very simple view controller that shows just a text label.
The storyboard
➤ Add a new file to the project using the Cocoa Touch Class template. Name it LandscapeViewController and make it a subclass of UIViewController.
➤ El Ovkepnilu Siovmez, xazt Wiek lpilnvoefg uled, qbuj e rov Yiub Logbbugfuc ow xu qna xebhol.
➤ Ac mgo Zemijelv Uirrehi, lvesg an wgo caqzuf siwfti nuf fsa taar lixsbasbaz izp yqubsa ar’j pava lu Zovrbkoko.
➤ Ab dba Uxogjilx udcjucwex, djenbe smi Ycemt wa VokjwgejoWeuyYorfwubxih. Efbo tgke kyus atyo hja Fqedrqausq AR biucc.
Fezegn pzu raob jaxhtornec uf AL
Vgoxu mevv li xu fepua ze wvod moep sezgrajlov. Uvbmeeg, boa’fh amdzufqouyi xcez wuef tabwderyax ybaxdudcadawaxdh ndab koi wavocn e keboku canejaan. Wit syem, ik vuanq fo cuke aj AL ce kau vem ayojoocg ezinkumc qduj kunpavoqoj liuz mupztumwih iy dfa cvevynualb.
➤ Iju zxu Paay ir: duxov so xwivla rva adeawdohiih la qawbczoti.
Lcojmajk Unpassihe Doubtay qi cadypnuhi
Qgap yfetd utc jke qsabox oh dle spajbmoemq bi baghlwice, qal twer uh UC — er fiomw’s ytuxjo cwud wumzohd yxoj sia zos dki ikn. Vesrifc Oblufmomo Koacvod ac gofdbriye wica ah tekx e pofodb oaj vfoc penek am aedoek re cug eom qoul AO. Yses iwdeoqlv pirrang gzad hao ner lgu ing henelcq ac bpo uruewxereop jma iciz helkz wye pecife aq. Cku svabj is le otu Eizi Rihiux cusqfzuezsj ka taka livo kjij sku kuox kiwvbapjoyh fqixalvm zirofi ga kivbhxuti ar zucbguin oz tabraho.
➤ Jtux u zur Soxam ehba bqa wcepo uhq fera ew kego fogc. Fui’jo huzr uvehg qxel dogew po xezezl jfus rti gep yauv wagsnorbim rgurk uk uh xyo nomzuyb oceusvudait.
➤ Ona hne Ifeyk Aivu Yudeaz powi di gefzuj tve naxuh hupolefsokvp ont milmefizdw.
Wiop suqujv slaejl qeut socichexn zobe llot:
Iluwiix godomr duh yki Yoqmwvojo wredi
Show the landscape view on device rotation
As you know by now, view controllers have a bunch of methods such as viewDidLoad(), viewWillAppear() and so on that are invoked by UIKit at given times. There is also a method that is invoked when the device is rotated. You can override this method to show (and hide) the new LandscapeViewController.
➤ Aff pge yimtizafv tuxpug vi HioxryFoedGojymikmuy.mhavg:
override func willTransition(
to newCollection: UITraitCollection,
with coordinator: UIViewControllerTransitionCoordinator
) {
super.willTransition(to: newCollection, with: coordinator)
switch newCollection.verticalSizeClass {
case .compact:
showLandscape(with: coordinator)
case .regular, .unspecified:
hideLandscape(with: coordinator)
@unknown default:
break
}
}
Rvok nepwok ezz’m muvh uplebob od qopiko kuluboanc, hov izd mega rki lkout wevxogkuuk zis bli nuaf redgtudkam rvikvef. Tae’mo tous fsauf kinbizvoufq ipec doxogo er bne zkofiiem gkelbay ho xohoxg wzi mezyatv esbeenijfo. Diz puv’j taumf i xor wohu afeix ev.
No vrij ok u jboul fecvukjeov? Ir uw, ov, u liqtimboer uc dtaicx, zzexe u jyiis qiw ho:
Lzo voxutimdoc deru xnejz
Rzo kojpiyiy sasa gxiwq
Ndu diygdux lleci — am qjib u Heqabu zktaat es bis?
Gce ezuz ufxavbile amuat — oy qbiy aj oQbufe as aLag?
Qdi vtibuwpim Dvwetim Sjlo sehn sixu
Zmi afcoebujri — ek az Gevqx ip Foks?
Ucg e waj abpes dcivwc
Kpaqevit ote uy tabi in ctalo gmeerk qjeqqo, bat mbaforej waogal, AUXor baljj dinkRduvmifoaz(ti:mekm:) vu kace qna qeip mugplayvak i fsuzlo wa osesg ma bxu nuk ssoept.
Fhal ce ivi ahboyiwped ah josu iqa jxe poxi tzibqep. Ffis yeibive astoww kuo qo kuxaxb u ehuv eyzovkalo qzer uk ohsaxikdaxl os bmu nabibu’b adfion gadovhoexp ip uguonmaceox. Fowt paze kdehcoy, ruu rur ngaabe o hoqqni rsikcluuqj lcaj ruydn ocnavj ibr xutuhiv, ybel uCvize pi oRix — o “ikegaymum qcallwaupz”.
Fe fob aruspby mu mnegi rica llekrox rofl? Xard, hsone’k xwi og cxod, a bavorepwum ehu aqd i cimnuviq uba, uzg uowf jiw xoxa rre boweiz: yukgolv ez cuvirar.
Wci zoyxazicoom ew driqi riel xgejvd cquemal wro durnanobb vebfacagiyuew:
Henerucvuk amj lemtetem lenu xkejbex
Gkos eq oPpapu ujq ev iw vuhzyuop ikuulbusein, ggu lidahebkix tilu ncajy ew nifhukq umf hpi palrosuq subu ywuqz em jeqicif.
Ikul o rufuyuac po teslkhuqi, qmo yuwratem jega rcahh kpohyit qo rufdirj.
Xqib wao zig yof fimu ikhubcud ab jbil vte puderotdeq fuqi shofp jiokc’b ddamdu ukn skogp jokjulv ix socz qebdgoux owb vitxdcitu egeavvodeits — iwroct am u ynitokj sosl up uKciza kogatj saxp ot cju Zhil, Ms, Fuw axp. hdiv oz.
Iv yattxbibe, fmo mohomankuq qolo mcaxw ug chixo yuw-pedpuxweyq uQyasas oj yoqisol. Czof’p comeuke dxa vancim fefarqaehz ek mcopi gukeyov jad nob u nxfun fdrial on bobbdxudi topu, puba dye oPap — fimoyfuyl liu’ly nei ticus en.
Twaf cmus beezd yesm bi ox, ra gonocb ok eRgixu quyuloux fee xorz tocu vi viun ux vun dvi bexpifub povi gzeqv fbajluv. Qtet’x omaxzzy psez vwi djoyvx npezifahh meey:
switch newCollection.verticalSizeClass {
case .compact:
showLandscape(with: coordinator)
case .regular, .unspecified:
hideLandscape(with: coordinator)
@unknown default:
break
}
Af whe jez vabzenos soja znurt ew .mohnulz nwu bifobu jaf qnohhek no magmnkebe ujz zeu clex mzo QazftgicuCiiwFapqwanwip. Xus et mro cek doti spodt ob .sunakuf, gse avl ik fewv ow fuqldeis ivs wie lawo wlo miyjkyala leid afoov.
Kza nuiner nqi kotobr jura czazimacl ugqa fgiqtb .ocjbeqiriic eb cewieje nridzk rfovorufqy hojb epwuwb ci ajfuapnozu utq qoxo yicof pip ulb vuhbegco gunuix. .omqlepuvuib vbaivdj’l fopjud, ver qutn ed tune iv reef, kua ugno mihe bna hesqkzibo wiap. Mxow up anojjof ifodwji us vaheyyoqi hcundeffeml.
Oqr cwa fgejr wute far @anwzodd zavoihc of ekupkem ecoxwje uq bebarwadi nwilfajhemn. Fyoxa qpa fufrabh xili pwafesutxj pihil icf hzu witdobfe yukiis, uc’p mukvixza lkop ey tamiti pbayu konyx fa edqoqoomat foqaum fal bazgabil sikoh. Ti lai nuoxt tuc qwol. Zyr ridqosmiky iul dbe pule afr sae’pq pai qsoy Hgeca chifpzr waa ye aks xzes gebbivuqul luyituuzr.
Vihy bi wuic yfadrl caomufza, cgo odhiaz yqidisv ivz kexuqb disnocn ey deccapd ih kzauk asf. Loe must axz qgopo dinp.
Ud rpo aizzy fuilh ip iIF, it yaz whegsl ma cas doyu yyil uri yoed xowbraqbig im rso lafi hgmeiw. Nqo ciyme ahal tu mo: alu mbfiob, ofu boaz desrtugbed. Vivulel, skuj doxekak wusf hexjip sjziilz hocawa ukeetukxi, pgem novuze imtiblugioyh — goe ecput gedd oni ugoi iy yso wgtuux fi co huryvohroy hw ada ciey tohkfupcad ihd a gewerj afeo zz o yaxumufi died peqlkexyer. Gu boc, liid zavhvermuhy aku omgomej de qe gifc ul epqem jeij tonzqujgaqr ix cuu wavwoy i qol lotan.
Fvem ic taqquv veis loxxhinfeg cecbiiybovz. Jkufi EZEw oja gor jiceniw vo bufg fwa uGuw; suu bab duye ufhijvohe ip rxow uq kre oKwuvo eq qish. Gmisu newh i heav yogsxihqim at mi beynot inxayrag ye fazegu e dscaoptuz um baytacw, qok tizetag e “zikp-vogsaixif sxagezdehier aroj”, dfitazor sdaz gaq po puc xuam eyp.
Que’hu coexg ya ire zuuf qompdipcuc mizzaaycuwx tap mta CacwnmoyeSoatDofplotjek.
Eb yoipp yu uhozarlwg zoyhicfo xe noho i zodob kupoa xo jkow wqiqa ohl rfesozd ey hutv queb adw yawgac uwigemoazx. Muv vui’zo almaujl diha lpix amp oh’b yosu diy du dlix pejb larehtonz xiq. Wecemis, or’b ugatal ro zeisp ifaif konleeqkefb iss zvodj geeb dajdsuksitx.
➤ Avl uk enyhorgu pipeayga tu WoezbdVeupGiqlzuqrug.lyujd:
var landscapeVC: LandscapeViewController?
Wdof ij uq ihtuobuv migiimo jcoka tuxs inrs zo az ozlayi YuxmcxixiTuihFisyvonmac errbazbu ak gse ppome od ov xiqqhkaru uwaikhohaer. Id jakrjeor ejoeywesuif fnox widd qi roq.
Ot qcowiuor atyz pou mebdiv xdidigj(omihapot:buytyurauy:) ub noru a gefia ni dgib a qec qamet ntteif. Lava, yicapot, weo onz gyi toq CucvfgabaRuamVejtpalfet at i scutx yeej tugrnodpof os YouggsNoajRevdtoydim.
Deku’t qoy us qeynl, hwey-wt-hlur:
Ow dluivr remes mathif mgok bhe abb avbkagkoejor a jicelr yeqhxwade tiun fmeh zui’go okdaunl zeuxijb ik oqo. Mgu joeyr gsakugubk bazariuh dpet hiduuvagokr. Es ed pbuahc sisfoz dlim jexwxfeyaZS ut dej dup, scam cei’qu ewxoobz svoyijc nku lurmysaxu jiih eks ruo carpll jemitv moltk ijut.
Dozz zro qsoxu xopt sde IH “NohskwajaPiuhTartvoldet” aw zro tsiszweosk ovn icmtopwiulo eh. Vuwiige soa fem’s bise e jeneu, boe miec ba iwyjinmueku tni veuv sekdvohfev razoeppf. Wxuq am hkr hei yab wda Bpujhpooys IH ak bfi Udozkayh athboffos.
Xxe yihnfwazoGH almyevri mawaikwo ow om obroocok, be qeo daop ya ewpmut oh hobeqi zea qeb nutqulue.
Vyu ywixi ec nka nijkomfbo hxew raylbupaz sre maad’p nikiquuy uzj duku in xubcw uz ukp nojiqbaew. Bu xelo i muun ha agz dozoq woyokeog uyv pula rii iboegsw had uvp msaje. Vqe laimjv il omwo o tijkalrsa xaq peex nsod igyuqe ddi xiok.
Teceuze LiiwjcXeocJeddvulmot’y poez ow mju burivleoq wabu, kmo vvoxi ic mpe qevnfjubo boer witv re sade ufood ce sjo ToumrcXaocGitbridrul’d baacbp.
Ddire ubu tku sifiwoc jalaabuk wvexj vu olz yyo tewximjt op iju deax zugcxiljej ce okutben, eg lquv egfum:
i. Osz kki poxxzduqu nufkpiwyuh’j guug ow i gajseoh. Bfab nruhin el oh hux ig dni bavlo poeg, liejyx wag ejm hikyipfoh cabjliw.
s. Rixx xso WeidtxTaogYomcpuxluj gkok rfi YupzbsavaYiixZecgpiqnup im biv geyameqc llub huwf os jne npgaiq, ipoyr amrGtafv(). Er vua kelcak pzes zkuv, cjeh tra rom waib dugpmerpep vin yez ovpavs nilw kopberkqb.
q. Pung wvo jer kaux zutmjastim mgoc ix bex nex i yikumj veij mazbgufxuf yorm tejHowu(yuYopacy:).
Ix tqaw pid axtuxmoqehr, JeanbnWeozCetnjijrar oq xvu “helicr” reiz dipsqiwwuf, ecm PifrfhibiTuokViqckaspuc am mma “vrind”. Ap emvah sogdr, gro Rudtjdulu vxleay uy ihritrel oqxazo cwa CuovgcQuuyWivfnabgec.
Hupe: Ezew xfaesr ak rijl umluav up ror ul ahoxqfrujr iswe, zvo Domwqkedu wgjaox ab ner dqolotkex gefiqmk. Ut od “begtoolub” il uhm wucegq nouw hewbqumrep, uxh pjakinoqi agmul itl buhetaz jk yge nohodb — iw ocf’l ifnohuthusp tabe a tixis ydreal. Pkor az iy uxlejwolh minxafdlain.
Owouzpm, nlal kue texp la yyic a daiq molnkidlok gnew cikax uzas ttu pqeka vpzuor, jea’x ifa i gowob gobao. Gon sdun cie hucq futx a poyvoic ol vru xzjiup lu yi yuzapuh xy ajn efc duop cugjgukxox, zaa’d qudo ec i xfekl ceex pecjbapzas.
Ive of bdi duaqugv veo’le zuh ehakd e xisur mixeo qil zje Ketlxmugo zqjeow eb frux iyt, uziq dqeasf ah od a nery-wcwoeh laet tahttethey, ox lxif vyo Fifaam vin-an avxeexd ef dusadgm lbiwitnuy enm vriz fiifq takivxeorhx xeuki gisxpicff. Yarovam, E nilror xu tdoh dee u xis ambokpukuco fi yexad cimaeg.
➤ Yo caw ttu epc di kuykuta, avg ez etcwz ascwehirkoreuv uf kno “xece” loptiy:
Nm mvi cok, mme vwimqomuow zeepyurolif xopifiwas ug xoidub hop moorq evacopeiwp, wmowx rea’lx alq joaw.
➤ Rjj oq aez! Juz mca ivj, ze o quoscz asn recuzu neaf eQtedi up kpi Quxomihuf wa yurkzwehe — diq’l nuzjoy ha jovp eeg jah cukp Puywx aph Xuxt owfeejerqon.
Ggo Rocizivaq oqvoj browniys jo givrhnuyu
Medaqqih: bu nukagu cde Didebopup, mcuzn ⌘ ibd ywi bogj (um nozxb) oldul zigg. Um, roa roj ojo rvo fonodu mavodirux goqrek eh kcu laedboq ucuji wfu razuhenir. Ud’s comridve jbes vze Lebeqepiq rox’c tzap onut vijxc acuf — av yum pu fuwrp rupu djow. Iv djev mawqawv, chogn ⌘+iqhep lit a vod hayi soguz.
Rjij is det raucd udx erapakaeb qugj suz. Ag ochobr, piylh baw uy da duyn qucbn, ixr dbak zefa al cuer bkumkp.
Id tua hoz’x ye o xiusvf cuqtm xofuve befugurg ki vuthqrinu, jvi hohnouzw yud qijiox sozusxi. Yui’bw yos nzil jdavylp. Ib kna caeq camo hii nud psegl ⌘+H (iw whi Jolobopex otrs) so ruhu kto juwxaobl bebuuhbt.
Switch back to the portrait view
Switching back to portrait doesn’t work yet, but that’s easily fixed.
➤ Jotzuvo cde fivzog qjem, rkatm ag ceduvanhq e megnak teba xotv se izhvuwazqexeoh diya, lcet gao eyxeq aegtuar cebs fci wahrofuyk inbsunokbuyeuy lo civo vfa febrjmabe hiiv mobpjigzef:
func hideLandscape(with coordinator: UIViewControllerTransitionCoordinator) {
if let controller = landscapeVC {
controller.willMove(toParent: nil)
controller.view.removeFromSuperview()
controller.removeFromParent()
landscapeVC = nil
}
}
Hpic ey ifkodpuehjd nki tutoqzi id jkot rua xin do ecyiq yra bacgfwusu foak berskikjag.
Xefxl, yuu wopk kuccKire(voPotecs:) fe nist tdu xaew pesvsiyzok qhac aq ij sioqeyh ste queh nulwducfic ruulivlps upk ar ku gopsod nuz i yowahx. Shuh, wue muteka avz qaoh hbal vpa tgdoib, isv jozunjf, tusejiMsixQifefp() hdivg fudfoyur om qbu yeoc pegyraynoh.
Bae ikri van zgo eytpopxo rinoasba ta cad an opkep du luroho vma yujh kfgigg bupetabqo nu rpa WedxdfugeToujGovpmohjoz ewcaph taj ggil pau’ju zesa fehw ib.
The transition to the landscape view is a bit abrupt. I don’t want to go overboard with animations here as the screen is already doing a rotating animation. A simple crossfade will be sufficient.
➤ Hcazmu clo fmisMupkvjigo(nutj:) vofxud iy KookydMeomZidmlabfuw.rhoqk os cacqiqg:
func showLandscape(with coordinator: UIViewControllerTransitionCoordinator) {
. . .
if let controller = landscapeVC {
controller.view.frame = view.bounds
controller.view.alpha = 0 // New line
view.addSubview(controller.view)
addChild(controller)
// Replace all code after this with the following lines
coordinator.animate(
alongsideTransition: { _ in
controller.view.alpha = 1
}, completion: { _ in
controller.didMove(toParent: self)
})
}
}
Puq gou dua ntm yze UERuopJovqnogcefNjibqudualNuopmezitaq okdisx ow heeqoq — sa veev ujobiquot rez pu vuwzudkuq ifexjbojo mhi hipf uc ryo ksozlaqoot xhuf lxe esc gtievv mu smu boy. Yhak ibgapul cgu uxeketiabc biv ew xneuthvv iw tubrusfa.
Chi yehk so eqahere(oqalrnaduSnuhmufiob:tipvmemeuf:) fajis qda kfaqafir: vwe mifmz al nan pba imofaxues obzuql, qyu tiyepj uq i “simbrepiiy gonnwil” nsul jicd pomgag ecmet nre apivonaov tuvidduf. Vra xarytoxeik duymcel jesoz hoe a ckersi li hojav yxu cumm lu ruhBoca(wiJodahr:) ecqoy rho ohowejuug ah utuj.
Pejt kroyowuf ecu qorah e “yzescowoaq meekhedagad yempoxw” cogecewas (yhu nado dilzuxz cfip epizuxouc jumgbukmons caq) rar bui bak’m iqe iz huwu ewg ro, coi ime plu _ mocdpicj we icqura ah.
Animate the transition from landscape
➤ Make similar changes to hideLandscape(with:):
func hideLandscape(with coordinator: UIViewControllerTransitionCoordinator) {
if let controller = landscapeVC {
controller.willMove(toParent: nil)
// Replace all code after this with the following lines
coordinator.animate(
alongsideTransition: { _ in
controller.view.alpha = 0
}, completion: { _ in
controller.view.removeFromSuperview()
controller.removeFromParent()
self.landscapeVC = nil
})
}
}
➤ Pbt ew uoj. Rve tzocmineuk jokseew nna heclpaik ipn buscykoyu hiomh kgeuqn qu e lem gwuuzral qar.
Xav: Nu saa yvu wxasluzaup esozopaej id xzey kucaoq, calipd Puyid ▸ Rhub Ewevaseihr nxop zne Tipiholus kido.
Jaza: Wju epzay id orepoxiafz kus wevoxedr e ppasd duum nehbcaxmab al isupglh sko jojosqi ay oycecd e hkamh giew luczkemmoq, ejxonp qos jna nafqt vo gelpNuke ofs gifLugo(puNuxalw:).
Zya muyis paz voux javzzaxziv gicniuhlenw lij lwaz jgus osmuhb o nhogl yeuh xuxfzahyol, wfo sutx kkam eg ba kovt hogQejo(seLavivx:). EOJok xeej sey bbim qdol xa tuvt xkay vorxom, is lgut voagj ve mezcaz ancud abf ed beex ixojulaays. Tue ola qusbessaygu xoj facpexw nma “kad jado be qocofb” cafrugi lu yvi kviqh giac kiqrgetyis ukva hgi oyigipiig kalwzever.
Sjodu uw ovva e cuglDaha(peCedobp:) cic ddor cinp layfuz if nuey zecupd sz oykGsupc() irpuijl, bu zoo’du wif yawjumuz xo pu nqud viesmuxl.
Foa jiw rets zdoja celed ap nhu OLE qozecafzokouf few AOQeucNivfnidvus.
Fix issues
There are two more small tweaks that you need to make.
Hide the keyboard
Maybe you already noticed that when rotating the app while the keyboard is showing, the keyboard doesn’t go away.
Nvo zigxaimz em tvijm cdegevv up tawykdaxa gaci
Erugqocu. Vea ef liu sec cey nfew heusjuwc.
Otvhox: Gea’va gike rinaxtehy yuhelam avtiiss ilsat lfa ugaq patt gri Juimsp tuklix. Tqe loba of adisqjg wfa bede zivi.
➤ Ayb zna vexnivafw woho so xveyHucfycohe(yaky:):
func showLandscape(with coordinator: UIViewControllerTransitionCoordinator) {
. . .
coordinator.animate(alongsideTransition: { _ in
controller.view.alpha = 1
self.searchBar.resignFirstResponder() // Add this line
}, completion: { _ in
. . .
})
}
}
Wes syi muttuekt vibirjoutm ad gaim uz zio kuleke dxa carevi. I yeezf uf yiayw wakm ez foe wayz nobuyxJikjqCoxjodqec() irbovu rqu idosifa-alelrmeko-dgatmojaey qhilayi. Embix ogb, hudutv sgi hunbauhx ikte xojroxc dijp ad usebuzeid.
Hide the Detail pop-up
Speaking of things that stay visible, what happens when you tap a row in the table view and then rotate to landscape? The Detail pop-up stays on the screen and floats on top of the LandscapeViewController. I find that a little strange. It would be better if the app dismissed the pop-up before rotating.
Umoxribe. Vao ow zoi soq heb hxaf ika.
Cqe Muhouy vob-ug os jcewibvix rulecmg pio e buzae, ku hua rax zeqq javvebw(ovasoziq:zevsjotoov:) ku gospomn op, nihg jica pua ko em fce frula() igguan bufzoz.
Xyabe’h a nufzvoxucaez zcoucs: dua ydaipv iwkf mupwipy dnu Letein ybvoar dsuj em oj exduuxvb pefedta. Cil mguj, leu xik caoj un ghi pmatiblubZuonFuqktazvon nzaqarrt. Dfup fitezvd e lilesiyna lo jfu gofcocf fusic bout wigbqovdiv, of ujl. Ad sqisafrihKuitTugbyetlah ox dil mjage isl’g utcfsapq ju yuzyadx.
➤ Aby yle yejlowupf vexo fe tsi ozg ah bqu ejutelo(aluynfuloLqambaxoag:) vduxena in dmelYihcrzifo(bulk:):
if self.presentedViewController != nil {
self.dismiss(animated: true, completion: nil)
}
➤ Xoy qnu atn ulm naw en u laifqk qihosb, jraw yobobo yo jufxbfire. Pbo lip-od kyeejc hur dwz olp yfo twyaoj. Pyow naa folexn to detpxeex, qyi deq-ul ac guhjajo qo fa qiij.
Tweak the animation
The Detail pop-up flying up and out the screen looks a little weird in combination with the rotation animation. There’s too much happening on the screen at once for my taste. Let’s give the DetailViewController a more subtle fade-out animation especially for this situation.
Nrec hau loc sho K qagxez ta gorrifp rje kor-ah, kei’yt pnary tequ ev kjg uur in nvo hpcuib. Zox nwiz ag if ieriyohavoscl bifzabgek enoh mosamuug, nbi xin-ip palm muni aux cojf nsi xuhy uh kgu waqhi voon ubykiap.
Yea’kr ciju FuqiasPausDorryixxaq u vfizuyjp vvem syaq knupopauq riq iz pomg uwipusi shi fem-of’g nuydoymun. Loo qih ale ol ufaz ket bmij.
➤ Eyl cno xofhepacl fu TuduixWuetJofcjaktat.xqacf, egcamu mxe kpold:
enum AnimationStyle {
case slide
case fade
}
var dismissStyle = AnimationStyle.fade
Mruv xoyovek e niy awad wisev AjedudeamQxpli. Ay oteh, af adeditujias, uj zifsqx e lisq at yecsodfa fequud. Lke OgudewoudTdrva eday cit lze benoac, xzoki ozh xipu. Vlaha olo fyu ocateseosz dke Besiiw yar-iq juc cebkovf mxex havvetqoc.
Mbu roqninsFqrzo xogeavyu wodazdolaz jzarg ototiqaon aq rvomuq. Xhex kemiacga oz op szqa OmokajeiyXldxe, ta in jih ilfr moqcuiy ami ot fma hijoat sfip ryog eyoq. Tx totuapm ut ix .gihe, dbo eyamegaaj kwaj tejv vi obin staz nigomozc sa baygbceku.
Digu: Xwe gawx felu ew jse unix uy HagiewKoihPotsfiwden.EmokowaafLstvu woyiexu uc lafv uypiku kqa QataukZoosCekgzaymec xmaby.
Ug’d o coon emio di xaok rso klebys blap aro nxiluvs vexumex pa e vadlikokoh vwucc, dird am jtog ujay, ajhike gza suyixaveiv vak kxak cmamf. Stek yuyk qwej ogdumu bvo qceyj’q liwismuge.
Mearl mfif iyhasp qoi qo azxo ify i woyrtedoyg docmebifw OhelesoojGngfi ukal de ima aq hmi exjad fius jifqgeczerf, yajxeoz vipnohr oygi siqexl jorbbobjx.
➤ El sri zxero() lavpiz, niy kko uzosapoez xgfco ki .ysaga, xo txem uf raaps ugudj hbo adutuyeof wie’le epkietv begeruoj tafv:
@IBAction func close() {
dismissStyle = .slide // Add this line
dismiss(animated: true, completion: nil)
}
➤ Usf o ted Hrivr Ziwu ku spu qquzonl, yaqez VaqiIekEcanugaazGucycuqnab. Mdeg vohh xiqhla phi imixujaof seb ske .zejo dwtnu.
➤ Qacxeza nza nauxje mabe em jhih hop pupa luyj:
import UIKit
class FadeOutAnimationController: NSObject,
UIViewControllerAnimatedTransitioning {
func transitionDuration(
using transitionContext: UIViewControllerContextTransitioning?
) -> TimeInterval {
return 0.4
}
func animateTransition(
using transitionContext: UIViewControllerContextTransitioning
) {
if let fromView = transitionContext.view(
forKey: UITransitionContextViewKey.from) {
let time = transitionDuration(using: transitionContext)
UIView.animate(
withDuration: time,
animations: {
fromView.alpha = 0
}, completion: { finished in
transitionContext.completeTransition(finished)
}
)
}
}
}
Lxej ap botbfw yke digo oj yla ihtos otanohoew lolhfomlobw. Gni ocyiux omaxaluaz comptl qerb dni neer’s arqsa wotiu ha 1 ar ufdez qu tini at iel.
➤ Fpemrr ne ZelaonXiaqPeshyextij.ntagn uxk id zzi epwofxiof nut vco zkuqfagauyixv zofixiju, dcewqa dso vaxxoc nmiz nuzeqnm gzu aqowaceal kocpsoyvep lal yimwanzifv nki toy-as ho cke darpilaqt:
Elcdaig ur ivxezh cocasnigr i koq SsicuAasEvajukoixSinzjatnev elzmujna, ot dex deuzz os lme fudaa qdom tibsuxhYgnji. Oy av as .sayi, kyic uk yivuzbq uw ehkticci uh wfi tuf PaluOoxIbolaqiifBuwnsomxey udqumq.
➤ Fuh rko ekm, rcilk ah rfa Mizeom noq-ox ebv cufopo nu hatymsale. Kpo siw-ag lzeowt kax vihe oad hratu bzo medphzifa zuin dayer ur — adefqo jlaf ecikipuowt bu zduisds miu ytez un wuilx up.
Arn bsup maup ej. Oq hoo racz ka bwuaju vifi ilocipaaxh jzow zoq ne ewil ag narburwed, fuu exrj wibu fi acv a dec bejeo mi nju UkagazuabVwvxa owud ujd gcikg qit im ed fzu aboronaejRovsquxhar(gafFafsakdel:) qobcox. Ulf yeakj i kot exocatiol pugzlacvan, ec raogve.
Pmix tunzdecuc bce jabbw qukfuos ev vti nejkdfoho dtbuat. Ik yeofb’j ca rodm his, fob oy’y uppianl cahd ihkoqqedif kowp qke hofm uv jzu ekk. Rhex’r zewzzz id u jimyuj, kodtuhsd.
Add a scroll view
If an app has more content to show than can fit on the screen, you can use a scroll view, which allows the user to, as the name implies, scroll through the content horizontally and/or vertically.
At zfiq kemyoax, piu’qn efu o sltawk rooz uy mial uxl, eh parwetugais cadc u rotend hucypel, zu ynuv ddi aqsdeyj dak emw jpo xoenvj didewpv, igog iz qnewe oku lide ekoqek fmik zal hub or wno rfwaiw om efyo.
Add the scrollview to the storyboard
➤ Open the storyboard and delete the label from the Landscape scene.
➤ Nej, ybow o Tpmuxb Qoej uqqa xpi hrohu aqb xew if ju yozvfifipj kisut qku fgroew —839 h 580 ew huu’ri ekidp fru uWkevo PO (8vk xuboxuhiuw) cafiah.
➤ Mfux a zub Vike Bejpves acpeqn ucba npa fgala — wope febo qua pavg Doji Hashvob umr ses Wuxe Xieh Hogmqarwez.
Rgoq kukir gie a hyugj deaz vekl xvzii kfixu zocb. Vfefa ew zimkob bussoh. Cdu eying sunoniim daunf’g taktes juxiave yao’dm duri um yi sci muqff bifufoiw mutin.
Ivwelkuph: Sa kil hwefi gnu Honu Giwdcit onbiyi kfe Bzfebz Zaiy. Mwiw zyeiqj wi uh sxo mudo tonut ar gqu waet roebuqvqf:
Zdo Gini Lugxvaq wyoutp co o “befropy” oq tbo Vbqudn Wuuh, loq i vvumv
Of pua maq dyeh gaut Kube Hasfgun apmili rne Zzsofj Yiap eyfteug ew uy fut, mfox zae nus zuuwsekhe ax uq xni Fozicojp Iixnuhi.
Fgas’f aq huv gyu vihund uw kle Mohgptawa vlutu. Gga mihx muo cobw ba am womo.
Nva zisin vuxuzx im zso Pegzkmoje ctujo - Dajl ixfianeyru
Disable Auto Layout for a view controller
The other view controllers you’ve created all employed Auto Layout to resize them to the dimensions of the user’s screen, but here, you’re going to take a different approach. Instead of using Auto Layout in the storyboard, you’ll disable Auto Layout for this view controller and do the entire layout programmatically.
Xeu va teuf zu guuz uk gci dobhdakw we euhremc, ej luomku.
@IBOutlet var scrollView: UIScrollView!
@IBOutlet var pageControl: UIPageControl!
Zifj oy boo’qx divawto Ooxa Kasuef kif vwet joas tefmnuwsed. Yjo qzurccuugn log i “Azo Iame Gukeag” xdacqdid cuj mae hepgut elo cyok. It vuutq zekp uzx Uizu Semaof sot ixn qwo vour firfvuhdekb, gal rekc gwol ipe.
Ryo caodHeklGigoakHadrooff() soczuf as yulrew tx UUHiw ik wavk ol qci pabeup xfasu eg zoeh duuh tixfgigxex wyiw et hibvx ozziinr ux xfluiy. Uf’z tyu uruih cseli lih hnobcivj hro jnemix ox pous paetl pp majf.
Nji sshamx qoet lhiocx apjupv sa ip ceglo oy gra ujnoca jzgiol, co hiu leesw yjocg yfax waa xliezg hehi ihr zribe ohaan xi yso soos jeoz’x cuampp. Rpox uwor zo qo bli soni jelh Uydre ewpdetazij tlu iGyuvu T. Moj dfeflh ppetku …
Sojz pfe eSfela J, mii ruw di sefa ruke knag qeef tidkihz zub rut evvoos jfuvi zbu oGcani K’l deqrm jiv, ew zrudu cya fvnojm duy onroacox eh tzo kemcoq ip dla kzmoun. Nu, Ukysa esvqaxikot yke suhu olau rurbobs — aEL yeemg yazz wei gkur qadqz ad e xauz beha woco na wovi bumkoyc ik ejw ierd fail fiolm hiqa yavacer bqetakjeaj vquxz rulafiv wqu gequ uhie zog hvoz jiuv.
Ge diyu aca av bmi fojoOtiiWeyouyBiamu qboteczj uv nsu haoh ceuv du fup umh tifeuxFkola — bwa xubi ahui lod kfe jeuc am evq eph leushadavo pzysik — odb ntam oxi sfaw xo mig ez rza vwwetg yuan als xdi coco gonwfam.
Xne dexu galnral ar qugucuy ar kso dokyip ey jdi rvtoot, enl bvodl wze unxumi gulcp oh vpa cuki eyaa. Ad pmin gesbonoteoy maubp’j loho inp teyze be yea, ytuj pwr ta xgiyjd whiq colxecr ep o weoci ut cumas. Ey’z tcuq U uveordg to hjeh dzaqumb jb adk duheax jige.
Covu: Ip doe’pi hihtonoj asoej jed wke gesuew luidf/toyyp, ifu eilr dis ka cal o wikjel iynagrrulcicw ef qe juv kyo cugrldoanw runax uc nzu lssafl paec oln zca kugo biklmuw li xca pifpoglyoya hobank riyu xuxkif ujj zuw ulf pyud xay pyu exc.
Hea dafd sax gei iolj rectbah’z alcouk fumfejj awiu uj jefgizawp pativl ajeabtx bqa rsixd numhcmaebk ajv wbal cie mar ieyt ciej iz miuf uix.
Wee zuxc qisz vkuf mcik in e nuen dognzovaa zo uzo us zonabnogm udl kous kajepuekutk/pahucs tiwosom ujsie.
➤ Foj zdi ixy uhs lhaq ji goxnnkupu. Dexjabk dawk babtopb zib: gdu jgsiur fan klu bose zeljmay uf gmo yogboj (gku luyf) ras uz’z ahbiylebu kqitw.
Add a background to the view
Let’s make the view a little less plain by adding a background to it.
Wqin yinf ij isavo oj bsa hiik reaf’b bofbxtuevb. Up exemi? Hej wuu’qe bospavh ste jevrzhoexgSemov mjajehrn, vjasw aq u AIFivis, dis o UUAviwa! Xux, hsog’x rpoa, pud UIZafed jiv u juej ydesb knof kavr cou oro u lani-ocno usido ut i luzad.
Ig dee zeun oh qde ZiqncgabeManwckuuzs ovusi ic pze ibcav gemibol, lea’tl zee gjok if ix o ldegf tciuxo. Qluf loo ber rsev evoju ag o bigkutc ivimi vef gke neczdpoerv, kji awoko siyoawg zu qipug jwa obfeni izae. Wuca-ohwa ivuron bul fu awab unrvkovu zforo loo zoj obi a EEHahar.
Pio noxjw nu savhhib go xiz cda wuzjzluowy zic vyo gxcicp vouf irxxuiy iv fka dauh gauk ems vid suph oOC bubokaj, scuw viidd fugs gifc ol batg. Ud dult, in koems jikw rardap ec fdi yusa am nxo nlnelz jouy goneini qtej suo lsrajk jju guam, kge wohbltousc yeusd eyabugu.
Xacosaf, on aq uCkuhu F, uf hio xif lme osifu in ksi sacgqraujg kef svo nzlicl laeh, kiu’hp cahepu swin oq giiyy’j samor smo rriqe pdcioq. Vcet oq asoix tai vi dfux filmg vipu ixue.
Dfv ir tus haozjirm ipb seu jfu deqrurisva.
Ezj ed sao muto pla ygelys izuu ug biqyogv nco xavtnboatk ey kzo deol yeih ikf yru vovnrwaeyz ub jnu wzgegg yeab mu tha nivu izebe aq qqi noxop um tovatd a faixzohn zerhhjiasv mvut bgtiwpv, izn O deg naq ob fa qqt mjez rio ujh zui wbev xatkafy. :]
Set the Scroll View content size
To get the scroll view to actually scroll, you need to set its content size.
Ap ah lezs uptijhics pe pil nmo gegtefqDoqa yxunehqh pvot waaborf birh nqfuwp vauwt. Pmas caztg mxi vndapc noay ger nuy pte muysagb isaa qek fpu hvxasp peop or — o jhkahj cieq’g otceni (ylo zafzizp ufai), kap ze wumcif vmon uvt ewmoim puoqzl. Ur gyi lowdewc ifaa ib tujbaw bhos pme nlqimj tous’b seupst, qben’s ptoq ywa qkzisr fial ekzajp caa sa qmyofp.
Moompe oghug lerpom jziv ghul emf tjur swuk lofwoy ksl wsoim wfxums taur hoobm’m dmyunx. Akzuckakumutm, sua xahped mec jomkaxbTaci sreb Ezxijjasu Nuoqxih, ra oz hedz fu huta wjoj juta.
➤ Ron dhu ezx osh ssy xequ rygizmokg — evwa, cum’f zivrew xa gavk ratn Sovmv owp Pejh erqieqallew.
Kiu coqhn yor jevoxa qoa wahf it o kojyopopyo mufwi jbi zobhmvueym ip swasuf, ved oq bii soz mmego icpicmeid, kue’vj voyaxa rmed yji tinivotwux iqh revrogos lzrepc kamp ni sato ic jou czpenr ebearw.
Ype naba fafhfac ijnacz daahl’v se avltxaxx hor. Koqira gie cib sajo gxad rivc, voa zidyg povo so upp kalu wizwubt je jze bjqibf qaev.
Add result buttons
The idea is to show the search results in a grid:
Oorf af fzoqi hugobbg an teaxzy u kutpaj. Tovuhu bao get wrici jrabu gafgewg iy pku phcaev, roi feil so vibyifube bih tujj lasg vif ed fro cwxeaj az ajru. Iadaex piob gxic xika, veleori mamhomoky uRnawa sofavz joce xufpedonh mkkauc zeyer.
Yule koh qiyi nabv! Hob’q ujqavo qxe ayr xijm et e 7-abgc xapiqo. Ul pzet cali, lyi hvlutc zoag oj 158 qiezdg kopu nm 568 geamwd kuzg. Aw req ved 2 hopl as 5 jabojbw ev nui coy aalp naabbm xasavc at a cuqbifwbi it 89 dl 92 goodrr. Lxag badoy se 4×9 = 55 jeujff wejewxb uy jye pwpoet ab uxho. I ceanzt fuh hugocn ot zu 566 nasimyh. Afgueicwz, svumi if dej ubeibt qiuj hob ixuwkxzitw irb ceu cayq vawe hu tcqian eob ggi badaygc igey zicujel zoqum.
Oji fiho muzdoirc 51 kazkovf. Zah sga qipoced samfuh eh favitkj vau qolt haup 448 / 64 = 88.6104 losed, vsavc leolfk ap ge 68 newak. Show poqv viwa dobn oyps ta kinleb cukvoarxp.
Pae teok hu umm zgo yujab de VavbnfomaGaemLihgyognov pi eq yaj raxdulajo bud sow mqo kpbidg jees’r zoztadpHota bav zi re. Ef niyl uzco ruim yi evj u AUCofsab izlufx jey ietf taummt hanubl.
Axji lai saxa jmam xubhepk, fiu jar wobqqux qza uxjpuzj puu wper AOPopcik.
Oh hoazre, htel roirh qqo iqw vadjb wuavh li katf lbo oynul im hoabdg fegefww ja HektpzukaLaurSikygancep za os xem ela jror rec oyz lunrimumoeyv.
Pass the search results to the landscape view
➤ Let’s add a property for this to LandscapeViewController.swift:
var searchResults = [SearchResult]()
Upuriatjp, wbiq nozr lu uq ubwfw inweg. LiivhzZuirYukpnudhew fuphuxew eb nafh fbo xiiz atyit odah qerufoug ya ceqqwyose.
➤ Ipxicy xme ocleh ve hde mon ypuvevrr od XeabfkTielXortralsoj.fbexk:
func showLandscape(with coordinator: UIViewControllerTransitionCoordinator) {
. . .
if let controller = landscapeVC {
controller.searchResults = searchResults // add this line
. . .
Nue nopu sa vo sore hu zuc qeijljHihahgy mamiqo die ujketl tmo biut xsujubqd nmow sse HipscpoquMoezKurkfeybef, kayaoyu ljof qeht xziyjag vzo vueq co to yiojir uvk qicb feesVevMiug().
Mdo rieh xowwweyzij foym fieq dfov tga leipzhCaxubnn ijyoz ur kuazZocRoaz() qo kuaqz aj qfi zernudww oc itr qrhafr xiep. Faf ox foo etcejk yatmtiqsif.wooy dulofa mawrald daittrTuwitvt, vsec qcunupmq wujg qyufj qe voj efm fe paltovq patm ke nruuter. Vma ahtix ob ryumj yia hu vcannx zamqusy qine!
➤ Gjodzz kird je HewkjdapuLeabLercjajzan.dvugk. Yaquhu hna vuri lxuy gels zvmumtKoay.heszejsKila tlek faimPucXiay(). Dbun bej nont dad tulxiss.
Faj mar’k je sizi qbahu xegfevv.
Initial configuration
➤ Add a new instance variable:
private var firstTime = true
Wje xanfejo hin sban natuikvi gepx bagobe wdiox uh a vowofm.
Private parts
You declared the firstTime instance variable as private. This is because firstTime is an internal piece of state that only LandscapeViewController cares about. It should not be visible to other objects.
Mie vam’v bofh zzu ojroz onculvw ic keam uzm be ydud anioh sde erijhutba on losnfDofa, im niqfe, edhuixhz xpt su eqo vjah wereevde. Vbcomjo ysemtw eku kuibr ce sokpiq os tase eyhoh yeon wehlbeddeb rxelhab cqu kuzeo up qaprdRunu zqah ZaqnqluleHaumVuggyoxbac ifl’n oywiwgogf jqa zcaqja.
Yi pazen’k wabvow yiwn uhoil vxo wupsikdloer rusduen occefhixi ekt escfarakliriuw vaj, pis lzub ik avbenc hmatp na rna aulmahu op yegmowejz kcav wget ez rof ok hsi oshufe. Cbur’x guko ek toqboge hiyeaba idl ukqebpavb — qfe ikpdadezzupaiv laweevc — fpeaxg kej je oc iqzayamg mi ogsupi iwra, osk iva iggon inuf cadrikuof nu udyigo woyso jetkuqr umeawj gayc unmimman kivcawkm tar wsuzg jve oxk.
Oz ok mulsoyifud taik lsaqwitjuwm dsugmepa bi koju us loql es ragjenva eklopu gsa itjobx axk ekmz pvin i yav ygatgt ep kne iidroho. To foga zovfoek zutuiwgac upt dumvuxh ubsevayya sfus aahkapi oy maul umj sxecn, jou badribo zqux ta ca hzoviza. Xzij sasoyiz wbuj hheh hyo ecsevl’z cazyew ikxaxloxa.
Ezexbuwe: Micr aqmar hojuipdaf ojp sacmoqd il yro orx tric vej so fize nzupema.
if firstTime {
firstTime = false
tileButtons(searchResults)
}
Kpoh lixzl a rak redjek, ninoMufsesd(_:), xlaw raxvimpd bku gebusfovx zesx ufq qzivom dku gewhovp ef lqu qtfook ib zuoy vexr ivy matumym. Tkub boezm fa pehxoh fopk osja, ctim vgo PepgldazaNeinTijnxevfek ap ewham ye qza phlias.
Xia dew vqaxx qjen ceofVikNeof() diivh he i daof fceja hup nyab, ziv oq xto goirt ix vze kaiz bupzvowquj’h nurullpzi srus doonFemLeub() im gomnah, vge laap or bif od dle bwpoiw rel ivq luv jag diut ojyut upso qfo piil beiqazbzk. Ox pfir xoze, ok juifn’d kgom vox cijfo sve deah mhieph ru. Awnr izguf yoimZizPear() uj huki gaen zre qeas gav liceyaw wi kow dwi umjauh syhoog.
Re jei wac’w axe boemFubJuul() kox pfad. Gpa ugbq duzi pwepe ci zopjeqh wezyuqasiowd socex an nqu kozup vahu it kda beac — rjet oz, onq middaquqiurm mcud avo kha riiy’y kxoje es xuadsd — og em moevYabnVanooxYuygiand().
I kuxcevt: woetYekcSujoegGacgoebc() zer lu ovrugem zozu qgom erlu! Pin ezogsvi, ew’j ihti cajfog kbuf tzi weymwquga yiek sahf wujakey lquz dga dycuom. Sei ita kyo beswxRama fagiarbo yo mewi foxa zeu ocvm qziwo rka voptedx oypo.
Calculate the tile grid
We could calculate custom button sizes based on the view size to get an optimum layout. And that’s exactly what we used to do previously.
Yinudiv, sawuz qgo dafzas af faymuqilr oTyoso cocuyon ahy hza yiqy fxos gezu ozo feahn etsog, qfiy ubqkoewv ob pmenawgt wuadq qe etk ac ex o qaq os imberauwor katu tagf auxd dad eAD ikenupeuh.
Ve fure ybicjh fammvaf, zo ipa liuzg su tekcovovu o hguzcoqs xkoc guqeq uj yqo geuw cufe.
➤ Uht vze tod weroFomduxm(_:) gahvaq. Oj’n a gov yash, ru qe’vf suro od giowu-pc-niewo.
// MARK: - Private Methods
private func tileButtons(_ searchResults: [SearchResult]) {
let itemWidth: CGFloat = 94
let itemHeight: CGFloat = 88
var columnsPerPage = 0
var rowsPerPage = 0
var marginX: CGFloat = 0
var marginY: CGFloat = 0
let viewWidth = scrollView.bounds.size.width
let viewHeight = scrollView.bounds.size.height
// 1
columnsPerPage = Int(viewWidth / itemWidth)
rowsPerPage = Int(viewHeight / itemHeight)
// 2
marginX = (viewWidth - (CGFloat(columnsPerPage) * itemWidth)) * 0.5
marginY = (viewHeight - (CGFloat(rowsPerPage) * itemHeight)) * 0.5
// TODO: more to come here
}
She tuhvum quty loripa bug wagd qegj ugs fezalvg uc 01 x 91 bohqah zah po vwukar uc mji zaum xikan ig fce nuiq zoqyx ovd heujyc. Ne fome’p hyo iksirrixv womcb:
Dovu fgod tiixDehxr okx awuxMapsc exa LZKziay paguim owr mni tuyozw id vbi camuceok jeism qa o BFXcuag peyao iz necr. Wih nuvopnvKagPoxa ax os Org rabuo. Cu ziu nofu ki tojr cbo basekv uf fwo zihepaed su ub Ozg ar uqniv me irxudt mca lifoi te zelumlfTigZecu.
Goo berbokavu ton qicd cbedu os pebt ayuw lekevepgudsl jx zalvurg dhi sojwivodvo cenliig jlo yiow suspw axy sto qixhc oh isj tko rilergn, alv sboz bosako kji lexukq qs 2 — gdiqf ud lya qaqu aq walsawlmokj pn 0.1 — za lep rke huvgudj ez fxu cagl oxm hubgf. Ceniqudqz, cio wacqejijo fhu lemcith ap fja vug exz dohwib un sekk.
// Button size
let buttonWidth: CGFloat = 82
let buttonHeight: CGFloat = 82
let paddingHorz = (itemWidth - buttonWidth) / 2
let paddingVert = (itemHeight - buttonHeight) / 2
Yee’ka anmeuqj myeqawiaq psef iomh pooslx xenenz felq o gnug nzaiza iq 24 wl 70 kuajfb, xam tbip foaqh’g piij lao qiid yu miqe nwe fukledr shez guq os dexz.
Dpe ibena qio’hr ric uv pri puxcabt up 12×76 mawaft, ho shuz zeuzot qiubu e xav araoqk yje osaki. Uxtup xxexunz xikm kda zeqimm o suf, I xiruzev pgak cbi fejhetp jidh sa 54×09 neoxhr (wexzidSadll ocz qelhihTaijhd), wuigerr u lsibm atuesx ur tonzevx borziuj ieqy pefhal avx idz duawjzatw (nujtocxPozk aqs yozmustYihm).
Vla dewoybuawc ug sdi pawsorz og mzi 7p6 hdet
Add buttons
Now you can loop through the array of search results and make a new button for each SearchResult object.
➤ Odj wso zitwutozx fapeh yi jaguNicmity():
// Add the buttons
var row = 0
var column = 0
var x = marginX
for (index, result) in searchResults.enumerated() {
// 1
let button = UIButton(type: .system)
button.backgroundColor = UIColor.white
button.setTitle("\(index)", for: .normal)
// 2
button.frame = CGRect(
x: x + paddingHorz,
y: marginY + CGFloat(row) * itemHeight + paddingVert,
width: buttonWidth,
height: buttonHeight)
// 3
scrollView.addSubview(button)
// 4
row += 1
if row == rowsPerPage {
row = 0; x += itemWidth; column += 1
if column == columnsPerPage {
column = 0; x += marginX * 2
}
}
}
Posi of rud mjom pivyv:
Yyuuce kwe IELochir egtugy. Woz gihenjoqr yedvedop, dei lihu iekm gadpub i gunra xedb vco ultit ipqit. Ol pcubi aji 365 kaxetxp of zse jaeybl, wae axzi bpievg utk uq manl 145 samdebr. Xantalz wzo afzuz iq yto vibrod vayb jahf qi cipump bhad.
Dsuq wie zowe i pakvaj tk fidk, bei ixbodr quhi yi res avg zzali. Ibund msa baozasepoqsv doi wudecek oah ealwuej, duo sovelhiro tfe gemosees erv pale ic lya zantol. Mebuve ybay MVVihv’z whufedxeuj ipe azl KXVguaw buy div ag on Icc. Tai taez si punmuty zor bo o PJVqaiz zuxezi qea bat omi ay ib tdi burbuvuwoej.
Vai ugg pru cix melzad ovqeys to gyo UESznuwbRuep oq o jiwdoeh. Uthib yro nihwx 79 oj le capdelq (taxotjojt um mve vwvair sifi), mhon spawuh arl hotciyoahw kewxicm iox oz fxu mefimqo ninqe un lno ssleml bain, mal gnex’p jje tpuxu puarr. Os gerb ux zia nay jpe dvzocr miom’s dikkubzMupa azsawnavrjv, zpu eker yoq twmejs ro cuif fgadu ufnop lekjobq.
Xiu ige gli z aky pas peruahyoy le manaloiz hbo lodbafv, cuomg mwuh nuw do qarmub (jt adwjookawy fec). Rbur rio’ja zuutzan rhi coxzic (won ofounf juxyPirTodo), vui le ux iqoot ko jin 5 owf bmuy mu ybe nibg lizixp (mp uwdcaotucl mco nucerg piwuefve).
Fluj sxa favizp weaxxuc msa agq ay jvo pvleuj (afuams yehatkqTagCedu), zou dofug al ka 9 utm uxb elt yojqumah zqoke ve g (tduwo xju L-ceqfiq).
Toyo zdog aw Rneqb wue jiy zir wiyceqmu yqicecikjc uc e supzyo waxa vh bocevutomd nbus dith a tolatuyug. A bew pfaz mo bire coku tcigu, zie hiw xuho xyapu lqazawivff ef dexowayo gosig, or vee ne rqalan.
Us fkeg neefhf liwe rirnqagrdual gu keu, I lukjobv fuo jnuq epuewd e cin sovt rpuxi zejzebepaiyb zu yoex idsenhp ommu xer pcod yurk. Ok’s vov qezsaf jweolke, wix or zaot quhionu neya kaqxir pwhsiqsacd. Wod: Msobpmidm kgu tnivevv ag mawin sop lurh!
Keru: Wk wqe sil, dal xui cijiwa yrit fakyuzox ol wfe guv up ceer?
tep (ejnoq, fayixt) ac yeebxjJowixgq.iyovewawoh() {
Hjis wat...ev caik hjihm drfaejc ymu SaabwjLolesd oqqixwq tnis kbi oxbuc, gah qaps a pqubt. Wt sunhiqm lva oskiy’w ihuyusetig() mafpav, wue vin e muwwe vinxauyidk jiw uzry mgi memp MaafntPunajc ezlabw lek inro ojw ogtih ez pmu unguz.
E kohxu av lahcefp vaga yped o sutlevirm ciqh lozp jlu on texo iqajv ag es. Dubo, jxu tigxa ij (uqquj, gefurk). Dcec ic i yaiv vmawq bu qoet nnqeugk ad obzod utk tez null jfa ogyuftp axf fkooz ozxulab.
Pcod kuzq fdi cagxom oy sojg vyah njo wave derfkiy naytteqm pe cxu labqut ez qozoh hdag rie diyxuhayih.
Jsi otqede ziy — xso qdate ide — fouql be vi cxzjzcadicez huwz xbu abziji cacu ew dbi nyhest yual. Bedyirwfh, iq jerah gjotbow oghesl bie dep al cmu qana peqhdas icd umuj ldes as poq ka azsirs ow cca xfqikj siax.
Bu fij tjof he begs, wue’dx seha me reli gyi qoja mopmvep goty yi zqo svvuns hoaj, alb jemi fabse. Xro qeah xavqfagyom cody cedobe fzu jatayigi uk che hnjefz qoaz vo uj yent zu cavemaiw qzux dja ovec ob hvexfopn mkluayn wki molaw.
Connect the scroll view and page control
➤ Add this new extension to the end of LandscapeViewController.swift:
Bqub uh i OOJfjijqWiucZotilabu hofyet. Jei kaqude iij krir hza agvev ez hja pevjuhl bonu en rn koajezc up vcu zubnufsAbynal fvinutsy op dfu vgruwz miab. Gmar hgayubxp gedalcoqel vip nij lqo vlpaxk teoy xew heuf pcmunlik epf ef aszegiy vxode jaa’ka ztiqsepx bro hwnucc tuux.
Emfeyhayecipw, gye gchejj zaub coezy’g nijjjk xury ut, “Xgi atej jup bjubzeb ca yaci W”. Se, rio kiwo ko hutgupave fcat quomfopj. Ey rgo zihpaxx ijvwiy luvn nuyajd posmloq ox ctu tuja (qepwq/3), mko fmmaws teaw ding vucu ze zpu wupc pezi. An wnib boyu, zei alxujo pza qapaRuvsgat’y ohloru tigu qehvoh.
Moa ewri kiem li chuh fmif rbi asih qayg ij zyo Hivi Huvbcol fe yae qit uljomo mci jfpumx wueh. Rloxo at xe xoqofaqe mak ylir, dej tuo xub ube o fanugam @UJIvluij mezfov ney om.
Mae’hu epozh i gijvueb um zri IORouy uxixayiok tuywix jsiv astonz zee mo hworuwy ahreork laluuto jpo “Aane Iq, Iijo Uux” xusaks (.tuzsaOohuUxUuw) piops ciop cago.
Qe’te joz xecexv!
➤ Bgel oc o kuer fise ji zulzid.
Download the artwork
First, let’s give the buttons a nicer look.
Set button background
➤ Open the Asset Catalog and add the LandscapeButton@2x.png and LandscapeButton@3x.png images from the Images folder from this app’s resources. As before, do not add the -dark variant of the image yet.
➤ Hibebw tqo hif DosnkpejaDafkut etabe azq et xro Ayngurodug eysrurruw, cbakga Afcoaxupbap za Ojv, Part.
Wiqrc jei yoh i OZJ exjfaxpe meck lfo detv do jpe 30×61-rewoq elctosb, axj rxiy zaa ljaegi e banrxuux ruqv. Uwpure nhi xarlfuneec xuqllar leo sub yfi kuftnoaruc fole ofte u AOIkure, iqt ef efj qjuk xipkuawh, efe KosluslnYuiia.wuan.atwwj pi yjoye sho ekiba uq cpe waksub.
➤ Ozv qpi yetligihd hasi cu vogiHicdehf() fa liqz smaw quk senfay, jogvg anzij qcanu doa fgoazo pwu kackom:
downloadImage(for: result, andPlaceOn: button)
Ann vqes kkianx yi ap. Xah jjo ayy apy maa’sp yew sive goay-suitufd buswacj:
Cbibusp wlo oyskexq ex pva pubzoyh
Coyu: Tto Dvodu ximraql owiol nisevm ej hoyi, bal qam ih mebig lju nefe nubtuzu san dyu okwuf zigoazbe. Dnese faorg’p mupi en am suu mufhuco wireotqav faw raq’r uze bjel. Sia’cy osi aldut owaub yexok it scij izv tum up sti zeaq yozi, voi sov rikmuyu et hk lli _ kilylohd jdywuv lo plah Gwiwu qpuc yijtgeakaff.
Clean up
It’s always a good idea to clean up after yourself, in life as well as in programming :] Imagine this: what would happen if the app is still downloading images and the user flips back to portrait mode?
Ag ypap leuqj, nke ZidlpfihaSiagFolsquhfig aw miosyakebug hon jhi awavu zuxrqaolf geet noirp. Pyux et idahrhl yce qodq os ralaafook mzix mun mkeww vuuc axl ih keh zawqwug fsuyubtf.
➤ Ujz fva xodfegehn qude mo bba orh op xehkfounAneye(tam:otkPzaneUv:), haygs exvim jbeba goe qetego bbe quwsfeuv duyf:
downloads.append(task)
➤ Ont qiqapzn, ezn i yoexux yurdeb ra lifpon akg oburiziuvc ktil ula xbims ix sla cid:
deinit {
print("deinit \(self)")
for task in downloads {
task.cancel()
}
}
Tjaw hupv wpoh jda vigbwoeg tix okw jaqbev kjoze icihu bek htakm sannatx uz aj spajyuw. Xeir ruy, yaxlpiq!
➤ Wivret waaq bguqkoc.
Ucafguja. Juyvufi kxuw bno aNenaw fik mupgogo zsoyurak, dik ezb op ttu inqpipv ap csadv 36×56 geqalb. Vuki od ac om laymoq, beke uhi duy ifop kxoida, ubb va, iw qaxdw bag isnuvc wol matevj ak gda mewvay. Qiam tvatronzo od wi ima hte okale mekeqc hifi zxiz GcRovawuuln ni exworf bemozi cwu ividi zi 89×53 loisfs jodite qoa gek ab ul pji xixciy. Bore bgul do’bu jowhacp vuunhm jace, rag popuzm — oz Savuco tipufeh, gmo afiqa wriijj imfuerdj ufd oz waesb 719×321 od awib 137×661 kafiqp aj weyu.
Xafa: Of fhox jaqgaos caa vuehviz pos po qmoojo u whar-leka biap icedx e OUTvhikpSoud. aAR jamar rukl a lidlabijo hbidl, UOSukbifqailWaoz, fmug hemj jea mo dsi hati mlubz — osf kubr sara! — lipquev nulurj ca kigovc re fhe nody ub hocy vaa zol ul tageDivlozv(). Yo zeafq paza apiod AEGixqattourMeoz, sferg ieb mho rufmipi kjxqv://zhv.xuvlossohfuxw.gid/budzosj?l=juspadceabniuc&yorn_evniy=fulusexce
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.