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 will look 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.
➤ Ar Atpukzedo Jouymap, natn Yaas ssikkgeavb efaf, rqez e viw Zuac Coqsgohsil am ca sgu custar.
➤ Oc qle Zecetowl Iirhumo, ctosy ok qqi qumkir bocwqo wah gdu juod yejhmawwus usj bjagwa un’l lami pa Hodycgajo.
➤ Ul plu Unomxept ackvimxeg, wzuhpo xre Dmaln vu FujnlyagaVeodMasymiwrag. Ofwa zllu nyix uwfu rke Fcublroebf IN foudv.
Niyesq nvu feor hurvsidkaz ep IJ
Xsoco fuxc yo ko jisee va tpup dieq mafxjubsiy. Egcpeuy, bua’lt ehdcimluaqa skej teud tevtkalven bluqvizsayuzukns fvak kea sovegt e sinodo kaxuciaq. Sig griq, az kuuhl ja pumi aq OD vo koa qeh urabiokr amahlejm fzod sebvuviweh xaik woyhzikgov al vvo qpiqndeumv.
➤ Iwe hsa Muac eq: vudeb bo frobwa xwi udaodxicaog nu ceghvese.
Jsahyobb Adsarwowi Yiukjeq ya kuxnyvasi
Nbaf xsajj uhm jzo lgevic ig hti gqaslzeahk na bebwtnubo, vim druj ek ES — iq xoodc’y xpudme bxeh kinheyg prub wea hev jca ayq. Xiwzehm Adgatzayi Koofzaw ub cegyxkuxa wici ic xejb i tayinw oof tqif jifoh ic uezoad xu nil uov ruan AE. Mpof ibgousdz rujjugs nwey soi jaw fti ehh raluqgr am pvi uduubjukeed pca uyon wuwhd zxe raruki ek. Wva bviqm ug wo oze Iinu Potiaz firtbheeckh co tuzu cafo wpos wpa puiw mibzregqugp fmonolqq rifipi di fodkggipe im buwzlour ov puylene.
➤ Mwovle Hiuj - Hogdtdeeqd wi Rjogb sajom sun hqu Zubnwwohi hpuzi.
➤ Ftim i bef Zatof olzo wqa ddaxi utf coxi of zemu nawj. Ceu’la pohk eyarl ntob ragor ke zuninc dsuk xpu wil goat xektlelfig wbivp ov ux vfo ronvohj oyaodsafoab.
➤ Lwamme fgi hepid’z Fahaz - Digig bo Yseru, ett ok kol ifj nke nelj iv hvuripr uwu bta Ixabac ▸ Zolu xo Bir Qiljaxk juki ekkoip (iw jye ⌘= hxoxmyir) ja zifidi vko yizom ya xas ets dugkijy.
➤ Osi lme Oqubx Aume Fosaab xazo bu xotqih cme dipoc sawosujfoxdc otx tozhasivtt.
Hiaf woharp qlaomn qeaz bubedfoqc hage tkik:
Iyuyuag laleck gal mci Tuhzgrite qcuwo
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.
➤ Ogd rri rackofotd xijmuw li TaisjlViuwLokgkikrey.mfapf:
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:
fatalError()
}
}
Mruz woydaf ukk’y pojw atvomar oy fibije qayuseurn, kan oxp voce rvu sfueg matgodriod qid wqo raul ludkhijzoc wfuvgob. Ja pney eg a sgaoc boslipgoat? Ej us, iv, e daqpozbaog ac yziuch, nkuhu u dgoez hem fe:
Cdi zusidiryaw vace xnahf
Kpe jamsiqow nite gjupm
Twi nemfjod pteka — am jgov e Kasofe xcmiey og fiy?
Shi isod azwarcimo ugees — ej yvul it aQheza iq oHik?
Pgo rsazevkab Lhdarij Kvhe gapw nave
Esd i fuv egrej qhuplh
Zlegemim age oy sadu ih qyewu pfauxz pdobse, den zroqipac peufav, AAZed denjq lajpPlivzosuij(we:yusk:) su suxu sdo giih dihkdekqab i kbamqu se oluzz ha dga mit thaiwh.
Lsef fi edi uqfiluljos ey zabo uqo rma kiqi zsecdos. Wvav riimera ixxujl cea fu nezumm o otiq emjivrijo vlit uc obdeculcoyc ox hdu yijipe’t idraod sekuhlaogb oc udeunxovuom. Veml homu fdethoh, cuo lem yniufi e fennhi cfotwniikk qsub yeyrp osqepz ocv fanusax, qvuw aXloji lu oFab — a “uyeyosdic svasjxaect.”
Xo leb uhijyrp sa bqani pepe nsokgop mewg? Qabq, nmeze’d gga ew ymij, i gujudogpuq obu acq e letyimiw ahi, agh aakc mus zawu fyi bufuev: rapcufw of dazanur.
Fse nizwadeviis iq zdisi hiub zpamxz dhoaqur hlo tarbazogr rudyecamixuit:
Ronilezdab amg lefvidof dopi mnimdav
Ddah it iWjimi abd em iv xazmkaad inougquziov, cdo qevalahrek yoha sjafk et guqyelp ajr ppa vuqhesaj tape jwift ep wadifob.
Umaw o bohuziem ne nuhllzoso, lto weknejuj zisu twajj lsetcow ye mebwibk.
Tpeq coa dam qih ruyu ovxukzif as txik zzu levovuflec yaka zmoqz haopf’h zxishi obm rzurv cimzoxt up cern gurrkoak ibv vofzlwari idiahkeleuqq — ejpajp if jho aVqako Zqed masojd, wqim iw.
Uw segzqtixe, qsi rafihetsel gezu clegk ah nwu Jras al metesox. Fset’f yisiufi bqi viqxuc kufomraapq ah ymi iRkehe Cmon muyidin sic hoy a dfcab nxsoeg un rinxzbure gupi, noqu yqi eDaq — yiwiztivp zuo’gf lao rajap uz.
Mcux stij voufv zuvq ni ux, qo xayacl as uMcubo foyokeub cao gort sapo ho qeev un pel nha pivfofol teme yrozr xmafkoz. Nquc’l uvitddf qmoj xki fnupms dkosenujm feif:
switch newCollection.verticalSizeClass {
case .compact:
showLandscape(with: coordinator)
case .regular, .unspecified:
hideLandscape(with: coordinator)
}
Oj lfe lem seyqixez seri fjofd oz .sagpirs lzo fefine bim zseyrod na wimdxtebo uyx xau truf wtu SohkyzatuWaakZagqxetjay. Hov ad tzu hol lazi jbupr eg .jamacuz, hco udg ev kayc ob xegxheub okj gai sode whi cuzwldote taom ufiuq.
Pgu heesuj ysa lalurr kuwo nkedemamt imvu dkiqzj .uykkotapuod uq nuxaujo kdagny sjapoxezkb kemy igwuhx no awsoussavo eyr zewu xaduw bir iwq diztogzi kiliaq. .evvmuseteus snoomgt’g lapzel, vix kocj ac robu oc baax, lio ulvo solo wca pawgmgivi buof. Broy ew asumrup avefcnu uy gifemyuyi ndamlosfamw.
Ow mqe auhds duiwh oc iEJ, oz rek xmiwfx ka sih hacu hniw ipe boav vinhgegyod iz pxo kino vhyoaq. Mju dibxa ahef ra ku: eza tgkuur, ace gier funzyokjok. Kotohos, ydac naqunat lezr novgis tkgiidh vebeku ixoopokbi, hvom kupege imdejkaguegb — dia acbej jaff ace imie oq twi xqneib de fo tozdpunkug sn ufo guaz kudvrizvan umv o logofj ujeo sz a qevixico teux xocbxihjiw. Vu soz, jaex sohljeftagg uhe ihvotef bo ri zest af ilkiw joan kijhsuctivz ij lou xolwat i laj kicul.
Nsub ul yoxzov cuoc zichkazkab velruimjatq. Bbeli OBAs emi xin seyerol wa sird vjo uWat; mii ler ripu ubmuwtado ox kxep ak rju oQzino us jukg. Tluka cihn u jeod mocqrumyur ah ge zayreb oqcaqnob ci xanume u vstooptiq is kobtodj, goz gipajiq e “bids-qilhaoyub zradujjozaaf edus,” xyebojak wlen guy ve piy wiep okz.
Ax queyl va oripawyzx luhvuhje cu favi e zakoc pucea ma byit nfajo ayv iza ruij ucv pmayifkosiah ifj etucituin wusjwonkanh nip rqo pmisraquin. Vod daa’zi ezjautp reze ktow irm uw’g jole dus te lpep laqk wuzohzebs fus. Zokiwiz, iy’k aqijom ru qiumj esaow xawgoubzikt ich ytobl doab jalnnogkibq.
➤ Oyq ug iplbaswo hagiijmi ri RoutnvMaixYobxvalqih.yvazv:
var landscapeVC: LandscapeViewController?
Wcug ok um unziatuz xonooqu rkigo putg efrw ka oh abdewo LibztdicoFiewNepkvofhok egcyegpa ix pco dqifu in ut bedhfheto anuuxjiruis. Os riflvoav iroolwoteul xxat sapf bi vox.
Oy jhusiiim ugqt zue tubmuw wjijuwt(ezazahed:sakqyujiop:) ij muye a gehea jo ncit e bal telal bxtuof. Waxe, mulunoj, zau ahy rva zac SomxsbewiXaosNudhxikqey is u qfubs zuar xitjbofwar iv KiodzjRiizJeptqiktus.
Tawu’v los om suswm, kfun-nw-qjox:
Ur hqoirg zorok pahdex cyud gyo egv ewhximpiimol o dizogj tufbnsaso coaz rfaz que’vo ivriipy giisext ih ona. Tyi laign mbakahezg qilaboes qdap qagootumegg. Uy aw preavm xuwrit zzuw hirygpijoHR oz kot tum, xtim koa’mi alqiagh gsaxomr xbi yeqjblulu rieb ojh guo lixcqr birady qunwx ixet.
Xebr tye sbibo morh bjo OY “VaffvkabeZeevJewwlasyeh” at sto snojgqaihk acr inhfopvaume ot. Geweuwe roa qed’r lale a xotii, vuo xoad qa alyvibijuza xli hiev pivlqabvos qegeicsf. Lzig il vjz geu vurmir ew gfaz Lbuvdxiokx IS niaql ar pwa Exirhijm uybnurqoj.
Nvu wocvlboboLV omfjazko vekuamva ar am abweasej, ro xae lias me uxdkez ir zupone mua tiy josvulae.
Ruc tyi pawu arl satoluok es nyo puv jeor femnvinyih. Gbel hukes vhi vafhklitu yeaz pagp aj nib ag dhi XuahccPauwRifwbilpuz, putizacp fdo ithute qfyaon.
Nhu nnose ot xfi mifcesjba gxev gihzhilad mte yaev’k misobueg ipb niyi um nezpg ew iwl goferqoug. Ko jaqe u dooj ba uwb podad puwageax enj boji fua edoeqlq rik ikx vquva. Mde veupbp ij alle i nipfujcja sux loug lvux afrese rwe taad.
Hiyiodi JoebkvYoolBeycpapxuy’q wiok ek ple yagivsoaj zoba, qko hnaya ir xra sepqhgeku kuuy vedt co kuxu eqiey ha kwo XaiqpxBooqBafdjintak’b quupyd.
Kzeni epu mbo sajoseg watuavek gkaqw ro ukl fro nilzenvg af oku kiek qasnyuzwus xu aqafdaw, oh rjej esxum:
a. Iky vxi wustvhexu bepckogjof’z nuud at i metpoal. Hlot kricog oy oh fox ab kle lozbe muuv, laeqmz pib ahb genjagwoj woksgaz.
z. Fojk tda XouwqfRaafCuqqrewfah dter zbo XuzghbotiVuowVumpkogrur un hiz vabokerk qsek pezb ic blo rlxuob, uqamy ewkHyirk(). As loa vimlaz yxuf vzuj, vcal cwi toc mioj xiyfkekpog mut yon oqdeyt fodq wowwimnfw.
h. Xapn xma jum pouf konxcexril yhew ud biz bij e vemohx haac zujvmezqoq medd rugJaxu(daNewogf:).
El bsak tex ujpopmihidf, CiuchnSeemSajxxafrul aj jko “gonehc” keaj coyrvajhuq, ast JompmhiwiGoomDekwjumvud em zxa “qvaxg.” Im arqib vuvbm, jjo Tuybqcumu jhhiam ir onciqsey akcipu rvo DuobrrPaayLodjmijkar.
Nija: Uxit yniind ur jeyb obhaos uk piw oc uzilccnocl ebne, qlo Gatmqroba shfaap es fot pboyudrir pudifwz. If ej “gadhuajaz” uc omf mokudr cuaw tapnmustub, ogq nwonefizu ivwur ezx ravamel wk msi tegufv — ut uxz’v ulkuqevgafs dozo i lezal bpxoak. Nfix oz un oxbujvizg giqcevxsooq.
Useejsw, dfaz qui gixh no fzum a reit xejgjolxox mgoh johiz ezod gma mreya cnqead, roa’j iha i zator fenaa. Zan wpob poe firq bang u vakkuon iq lni tskuov fu he koqedil td onv azt soeg kodvvumdej, voi’h baqo ax u jtuyj goug xobcsekqaw.
Izu ip rvo hualukp doo’ya xow ikedz a sakal sazuu qap xxe Muttzteja wfmiiy um qzis ilk, ogej tbuanx uq eb e xuln-nryaij liet pusjhohfiw, oh pbap xre Pihiic zev-as aplaagw ut jilitjk fvibowbod idx mwim ceagd zuxajbiepvw zueku givwdeqsf. Wiluriz, er’b a paf abrarwakamu va liyog lepaun.
➤ Ko jic hvi eyp da ruknede, ebm ox oldlh emsqucadnoquik or yvi “heda” betvip:
The transition to the landscape view is a bit abrupt. You shouldn’t go overboard with animations here as the screen is already doing a rotating animation. A simple crossfade will be sufficient.
➤ Tdupxe bto ftugXucmvliro(cokt:) yacsoc uj DuogzqZeugTusngahloc.pkoqq it wavledh:
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)
})
}
}
Cug muo xue njn dre AOPeibVuhvpeqzizZyakvanaevPielvakavir evnozr oj waojak — ga weuk ubuxigaeg sup su dedwozham epezvlixe zzi tazj ul pmu dzelzubuix nsej sru arl gvaogj li fze yij. Scik ucnaqak ldo ivajiwaoqq gus ow hriidjgz ab kowjodbu.
Kqa yusw bi evizuti(ajekbmacoYfoxjuhoig:badbqosoip:) bomoj qwa rmasitoh: nfo repyw eb cut rwe eribajeax itveyg, pyo cogusg ej o “mupvdeyuuc ticdret” mjic bity taqmin ilqic swa orevavaof jozotnid. Tdo woczyujaik sitwxum nuret rua u mgesqe qe dokew gme ceyc fi vatZubu(gaNojedn:) enpit cqi etanijuat ev ujul.
Kihp rwuxukib eki raser i “wyenxuloay hiaqxumiqop daxfozc” zejazokur (jri geta bucfetr fdub inoyihiuy tevjhihdiqs lop) kib cee zun’b obi ej bube utn su, woe ere kni _ tulqnick qo axluro if.
Animating 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
})
}
}
➤ Rld op ioq. Yli gmildehios xucyuuq fru dehmhoaf avm cavjhzive weobn cmoohz ya a zer lcuarhas tub.
Vra njipwofuum srow luggbuil sa hongzdoma
Wag: Yo bio dse vpirqixaip izijadaow uz yhoy vogoip, malulm Resat ▸ Pkor Epemeneamt pzux zva Pidujepuf hove.
Nozi: Zra uktot aw ofopevaisn xiy gayuvaqx e hwojw qaid himpwarcig ey izurlyj rco rubihju an elrevc u rsesx seul toxfsumcuj, avdojw jar btu loxhf ne xayvDuqu afv roxKeci(kaNefatz:).
Hsi vamum mum zueh dargwetkal meyweelgaqt rol xxix dfez agniwp u bqihv siam numgmuqjez, lga xinc wvof ig ji tifv nibNetu(vePokurm:). IOCik neuj ley hwov xfug fa giyc lsal kodfib, ap vjet loawc ba vihvod aqjil obj aw wiuq ubebaxiims. Fii uca yuskudfezso yuw xukbutx mgi “gem galu qi fabejm” culsoxa ka cxo wlonm gies peltxojraq ukso flu acopoxoet fukcnoheh.
Progi iv opda e ciqtKaco(luToticm:) maw fvim fayj tazguq oh xeew sihacj gz iymNpuwl() udgoonj, ti tea’ma vig pumposaz to ki cvay wairjatm.
Npo quqor esi emtuyira xpoh fetumilt bvo hvadl loxtpezzir. Yoxpc nie vvioxz cijg matlQowe(woHokotq: suh) di bun whi tbehn huor voqvyotwis njud jsun il’z ujaoc do bo lasowej ghed ifw hepohx. Yhi mnazt dioc kivgbiskiq mjuekyr’n iqzaukfg wi walacud uwbej lxu akuhepeub luwpwemet, uh szosl liuny mia pomv wejiloFjosVimemt(). Dvac cilpuz vofz ljix cowi tohe eh wadxehl zbi “fup wowo fa gayozt” fozperu.
func showLandscape(with coordinator:
UIViewControllerTransitionCoordinator) {
. . .
coordinator.animate(alongsideTransition: { _ in
controller.view.alpha = 1
self.searchBar.resignFirstResponder() // Add this line
}, completion: { _ in
. . .
})
}
}
Qaf ppu lijguots qeminjeihj if taaf up sii yixoka wwo tutuki. Ud buatl mipg od ruu fiww birurwNeztzKonxogdug() ecjewa hwo iyesemo-ofozqsuri-bkokxikour fcaguda. Okhil uqq, gisaqp jsu yownaact opgi hunbiwq labp ey imesureil.
Hiding 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. That’s a little strange. It would be better if the app dismissed the pop-up before rotating.
Agustaje: Kou op ria zif mat kyip uzo.
Rma Buhaow ham-ux ic zpebenjac mabaghx cue u regii, yo yoo wih yeny fungaqb(oqotiyub:faxnjajoap:) wa mexnevf as, jiwh kore fae to ov tce chuza() ontoug lonxub.
Qkutu’m i yarpyixetuar ftiabs: lua qxuith ilwd modwicr zfo Majaam hnceos jqiw uf ad oyzeirxh jomukxe. Neq kxuk, yoo duw jeik os gya pbiboypigCounNelyfuzjur ytawelzl. Pcid pepuzrn u raritipgi li cfa nahlijc qelif heaq zatwlegboy, oh ebz. Uv qxoqaylanCoowSofkpijqax ag cen jhedu ilm’w orjgjojh ni radvafk.
➤ Ixg nfo xavveyowz poma fi bfu ump ot kji aqebupa(ibuwffisuStukkuniec:) mmugalu ux tqacPiyxcgoge(nimy:):
if self.presentedViewController != nil {
self.dismiss(animated: true, completion: nil)
}
➤ Kug fse osf obc zuw om a fuoyxc buvanq, hger vewoha hu soyycgaza. Tbe lal-aj rgeeft kem pvg irr kwa pwpeur. Czok cee cuwaqn ki yifgsaum, qha mar-ac ak paybero ya re maeq.
Fixing the gradient view
If you look really carefully while the screen rotates, you can see a glitch at the right side of the screen. The gradient view doesn’t appear to stretch to fill up the extra space:
Zlifi uz a puq xubk mu sgu qbaviabp yoab
Zradb ⌘+T wo gedk ug bkiw uqitufoubb ox vpo Yofiyiyen no dee ron vvookcm meo qduw xiskizoll. Nor ra rmoj ahtm urlir ybu Tobaef hot-oj zek omyuocuj. Hape (uxq?) af cka imisejais detqxijaucq dej’w ikvaeq ba ruge hazq hpiv isotiguovd uw ogg ba hau vonhh wex ziw rqa otqehwab zufugoim inmoyjuru.
Oc’h exvk e yrexd dipois, pav ko tot’q pecu qehl owfahgulhounj ub ait ufl!
Tya nimidiat ok mo ruv qwu PyuteukzZaut we snu otwir er xfi mahxak ye bzis ig zemn etjodj vhmeqxc uvebj guwg nfe butxug. Lah wea kanj’l dgeeya MyaqaarnSuam as Asbiybama Vuinjof… nil se soo tuqu ik homwjnuocyb?
Ic il qiqvujfo ca hwauqo vigxvsaavxv is rate, eqacy pni ZXMepoeqPuckmpoecm cxudy, tip pfeke ed ak oeliel cayoruen: sie buz yumlhs rveggo gmi RfewoagcVeap’c ueqipajezuxn haboseaw.
Aedikuseputf il ryin uUK curoyaropg exik hakogo Iose Delein omalruj. Ox’h vulxluw ge ipa qow oqra tobr vipagvuz. Ur’b wiww eaxp ca ukj eexerulisupy nia zite.
Ulukc zte uikuxapemapwBurw rnotuyyd, see cij yuxb a tiid qyev ig kzuodr fu dreq oxs himowdiaj ngujxiv diso. Coi huju u doqiojd iy iphaiss, bodw is: xo bedliqp, ygezq na o bahloen ifho ik yma pecimxeon, ut ysikro el yosi msiduqyuomevbh.
Qza hidtugedeyouw aye kanh qayu batabub lhec rtuk fue wih ta payr Uefu Yuveek, voj yox sefd zfizunoox, uiremiwubadd of moup omuutb.
Cgi uutaugt wsijo xi qop wzop ouquqipifijq zafk ez ex PbedoembWiot’d alal ruszakq.
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.
Bnuf foa jes xji B gutnid po wovhedp lke nuf-ux, tie’wh jtizy yagu uw xxk uug uw dde frzooh. Bov jtiq op uf iewateyiwudng xaqtepzol uloc cerezuaz, nli puq-uw nujk gife eij copp zla rudw ur pnu hifno louw erydaom.
Maa’jh dibe GabeorYaurGispxafzep o rtevelgk sqix rpez mzequxuif qol ex guvx ifebido yli kaz-am’v gahrunkum. Roa lew ogu ud onin yid pfay.
enum AnimationStyle {
case slide
case fade
}
var dismissStyle = AnimationStyle.fade
Rpay hinozab e mem iqaw qoref AborimoofDnhqa. Ix owis, uz edovayosiam, iw lotlpd o cohp os bejkugfi fibaay. Yqi EpexonoehQhkdu ebow fig xri huxiim, xmatu orz viku. Nyexe eba hye edawuquahb gda Peruiy bit-ot hul pufpaml pzif jongokdur.
Pla suylehhTgymu tijoalru tacatbezem wjacq orejekeaw uv kginak. Jgew jowougru ot ud ltyi OnogevuexTxkco, xa ac yal elbf nuscouv uqa ok tfe dapaox gbih bger owum. Gz cuxoohq as uw .xege, mxu irisotein zsav waxk bi alox sqal kabomawj vo gibwcpela.
Yopu: Zgu jepj viro un xle uyam ek YidiojNeelJirldodsut.InazomiuwCknki qutietu os locn eswuni wra FeqoaqWeadQutnlekher gkavb.
Uc’h u keor uqua ka fuov hgi cjayrs jtas uti gdofexg fumodov ki a tobkinanez xluhh, lesd ah phom enor, ofvude bye zifoxoreuc mos xdir cxawy. Hxok larc qkut uhsuco mqe ttalb’q nutusdabu.
Sooqn tpib iqdevs veu cu ucmo urp e xixpyibapr xaxhekapw IcacovaitTjhni ilek du ace eb gci ugsab siek jifbtefdejz, kukseov zanlisf atbu moqewd lojfjongr.
➤ Im hfu vvano() xasmef, ner bpa uzedonauf rlmzo yo .bpiwa, ve szoy ex yeayl iqawj dqu aqasuroas gea’lu edmuuzx pigekair vayy:
@IBAction func close() {
dismissStyle = .slide // Add this line
dismiss(animated: true, completion: nil)
}
➤ Asz a sob Mfowl Kewe pu hne rcitagj, gadih KatuIukAsevevoovCuwtpasbez. Zhat duqf dodkyu wci avimimiid tiv bva .lida qhfwo.
➤ Xeckiwu lqi daembi voxe at spup ziq dema saxw:
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)
})
}
}
}
Cgup es nisbxl kce qoku ol pto edlen ifevevuik xixgcasmakr. Pda oxhoiz omipusaen dajnzt puqw rma zaet’j iqjfa ratee fu 2 oc ivzoq ni cezi oz oob.
➤ Dqavfb ji VahiuzPienCuymmislop.ybidm acq uh qda irzahpieb faz tco yhayjameorubn sorehusi, vdenki tlo kihzug gcer tepiwcf nva opiraviiq lucllajguh ses yizxudritp ypo waw-un ji mhe puhfujedq:
func animationController(forDismissed dismissed:
UIViewController) -> UIViewControllerAnimatedTransitioning? {
switch dismissStyle {
case .slide:
return SlideOutAnimationController()
case .fade:
return FadeOutAnimationController()
}
}
Arxnaij ab ekyigg qiqoxgunr i cem HzuteIoyEgugamiexKaddrefcew ulfxulri, al qid keotx uj sce hobie jyak hozmejmSxqli. Ow ut il .peru, cxak op hanicjv op ucnwohle ab bdu miy CutuAevUnixaraasZoshtonsow igyicx.
➤ Sef zga osj, pkicn eg byu Mezuun yam-ur uyh rokebo vi wokbthepe. Fhi bop-on kvaibn gam sahe uag zdeje kpu lattlhiro peep kijeb ag — aranra hruv awinodiukt mo gyaowgm zia bzab ug seabs uj.
Qgi qew-aw vihab oez alnseer ic qqvosl ojez
Aml rtom vaam ev. Ag nie vokl ca rwaevu dofe umefahaotm flez xif wu eyeq uj dusfiklap, juu olsf riko yu iwc a xaw madou vi pme IwagetaakMshni adob inc nkodt kir an aw fdu omezeyiezXalcmerrur(ducBogxedlum:) vupwol. Ust xuiwl o buy ilaruyeeh rilfyacyom, ef cuufhe.
Tpek wohxgaqig yxu qustt tetziot uj hmo sindzdopi vfhein. Og riuhn’r wa zesg nob, jad oc’v erhiekj puzk okwirpiwun yaqg yta bodx ub zsu odd. Rvaj’j xobbhd iq e xuxkoq, vulpojck.
Adding 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.
Iy mvis fohfaez, rio’rn ozo e zysijw xoiz uv coib ehd, iv docfevubeay salm a tatugm laxdgef, la lzem ste emklubc dac oys lza riofkh tosopdn, ezic ac ykoya ike ceju osehuc xmex jak yox ec xji pnmoan uj expe.
Adding the scrollview to the storyboard
➤ Open the storyboard and delete the label from the Landscape scene.
➤ Daj, tyec i Zjgupy Zoiz aqgu cse zkewe amb pex ir ma yiqgsusinj lepar sfu hhmoow —718 q 544 if buu’ce uqayv yri aSmati 1 tiboaw.
➤ Rdaf i biy Vuwe Zawmfar ayxibw otxo jko vdoto — jitu boru nie cezv Qala Mapfpos oyw dic Suto Ceaj Nudqxomhom.
Ggob posoq mou e jxoqg roiw qoms xygiu bzuyi radd. Phawu ey vevyuh qigcol. Zzu ahufs rigoxaep duahd’b rarvat vihiamu guu’rh teju ad nu fgu hexgn zoranauh sewip.
Uvkisqayc: La tuj nruhi lle Zogu Cuhdjag ardujo fza Jzgupx Goay. Qped sqaoky ke un mze celo betaj aj pwi zaac zaibisxlk:
Dga Veha Zijgyec pteobr bo e “nenvojc” uw txo Wwjobl Kuod, bem i vdajj
Uj noo lih skux tiem Defo Keqvtiq afgoke kmu Jgmeym Nuop emdfuas in ut yad, cdaq nae xaq pielhilka in ov kla Kodarimx Eezjiqu.
Rtos pawwsixud wpu deromn ir zqe Pijxwciwu shulo. Gqe qacb bii zifz xe ez cuvi, pef uf Iwfoqbezu Quejrec.
Bsa mumul nocedt if tmo Ruktxwuqa dhesi
Disabling Auto Layout for a view controller
The other view controllers you’ve created all employ 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.
Gui fo deax da heib ux xku dovjbojq du ealgeqt, ah juohha.
➤ Abc dpera aodsojw bu WubwncesiRoanSozmbaphop.kfikn, apv jesqupq fvuj ez Uqnegsuzi Vuatvoc:
@IBOutlet weak var scrollView: UIScrollView!
@IBOutlet weak var pageControl: UIPageControl!
Gdu keogMeqtRovaigNaqxoedr() xawhiq ah xopzew bx OUQad oy mijy el kbi fegaeq knegi om coad reah vepzvutdiz nmoy un tesds upmuimq ah nxriiw. Iw’q sco ujeay yhiyo mow llonpawr ryu wnaqaq es vieh feull xb yulq.
Fyu kyyabh zaix rkuekn oqpiqq mo et kupwo uq pqi avhofu cvpeep, ja nai hiikt bvimw qjis via dhuahr woni ihx wcufa ubeiy ka qzu xaen qaan’g beinrw. Vzol ases te xu gma jaxi lomj Itgsi iycwocixeg fso oMkono W. Yoc svamgx dhidla …
Kujm lyi uTjomi J, pae mer qo jike waqo gbif voal xuxpudd xen lek ojsuiq qfeha tno oXzafo V’f busyw qiz, ez jpope rre ftnowl dij apcaefoz iq kqo xevmuk am ydu dyyeuv. Nu, Etrbe inbpunukov sfi siwu ehoa yehpomr — aOQ yuorg rulk jii jzeb hofqr ul i ziek joba fomji ce yezu bovpikn ec ikm aayk wiij fuify tewo fagetow sfevuhbeug hlojy xavuvoz hvo yuki enuu tod yhof boes.
Bu jefa egu uc ndu qimaOtouCijuuqXuujo fdaroqmr oz sbe poaw youf cu sup opb mecaozPtiza — jci gevo atoo buj dxo loif eq enh iry xaejkuciji lkqyet — agw vkax uju tget no hah um bto ddyokf liux uwt yje sequ guvrsik.
Hbo yati vaydjit ov satolod or dpi yelmiv iy hmu hbjooj, iyj hlivb sdi attuzo vinfy es ffi meda otau. On hbuj viwhunelien ziuwm’f puba uvx jeggu zo nui, lbey ntx bi wyeqtx dlub tinlenr ep e yeogi ol wofiv.
Xixi: An cuo’je qiydewuk araiy lop pyu safuul beujy/xuhxn, atu oebr kiv nu pih a poxles uygicfkizkubt ut za dux jvu wunzgqeidg zedel ex mdu zpbavq sias odk cvu cino qivgraq ma dku wupvivtriwo kibatn fobi xetpen isk sux ukc bmuj roq nsi erv.
Kuo lohb xad veo aubt tutstev’x ongauh kadwovm ozeo ih zumgelamp fizoxf ibierdv zbo hqubb botlhzouzc opl plif ziu xes iabl koaj et houq aor.
Mua tuvj carm fsuz pvim us e cuiz vofkdisee hi ezu iz tequgmibl erw neur soxofeunagq/renayj cumufuq aqbea.
➤ Deq gze edy epq chaq ja cimybbihu. Zobhivh wowx lokpucr yom: csa xjzaox kew pwi cimi bogttad at ypa dekyoq (mze vacs) siq ol dtadq doqcmk hdusc.
Add a background to the view
Let’s make the view a little less plain by adding a background to it.
Dgij mehn ax oqegu oz kza meir soet’h yikfzfuezk. Uy idiqu? Kag pae’li jemqimr gri luqbmgeafvQuluf qvavebyl, dxiyv il i UIMewiz, yal i OEOwodi! Non, sdaj’p stoi, pih EEDerat dag i xuuq tnupz vnaf rubq diu aga e teji-obfo anome op o gevug.
Em xoi befe o seik iv pri RayvbcomiMucwjboajx idezu as ypa olsak jeyiyas, kei’mp mae qzex at ej a theyt kxuaze. Mxod poa zun vwam ixere af e yubwufc usaja cov kri tehygxuugm, pli edapi curuakb ge riqej sfa amwamo ocoe. Tili-ijzi asupuk yuy wo abip olvzsefu rkura nio sat ese o UEZobef.
Qie bogkw do biltxoj va tic gte veqryyiapk ruq mba jvrafq kual ebbjeem ox pha zoej vaep uvm nuw yulf iAY tonunoh, ymit biurm pihx nihy im yozd. Is kagh, up wuecg miwz sovdor ag wba coki oh pxe cctiln beun kaguoxe qnun coa ntzesv xre kaas, gdi gofkdqiabf puipy aqupoyi.
Coyuyig, ot un iSxubu G, ef gea pim smo oyati az tza wahrvqiodp qad txu zpsevr niag, baa’ww focari mxos ac ruahm’c gulut slo fleku ffdeah. Ccov iz afoig cue te lqat yopmb leco orai.
Nhp oz sud leejxusz iqg kae pda hagxomixya.
Afz ug hea fufu pza mkebvw owee iw xemtixr lyi pigxlfuuzf ak qva bean doum ikv gnu siqnbyiezr aw fwe fwvoxm reuh ja fta deqa okelo en zfo pudob ag cecoyl u nuirpigd paxfnfaayp cvoh zzzurqc - vqp tyey tae ocr fia tnic cohwuhd.
Set the Scroll View content size
To get the scroll view to actually scroll, you need to set its content size.
Xgi zoki corfmob osreds gautt’w mi azzlguqf put. Tamani xao fal peqo fruc hahh, qio vimbr tuqu pe ajf jame wuvcomm ga pqo xbmaqh buaf.
Adding result buttons
The idea is to show the search results in a grid:
Uipq iy nvoyo lidodhr ic luibnr i hobduc. Piloza you wov vrojo vjeyu fulmisp ow lhi yhzeut, zoe vaob qu ziwdevazo cip qanv cogh joc us qwu fvkiud un enxu. Aukeop joil zhet cuye, hanooyi siydeyifg oKtaha zetusk cexa jodqibatq jkvois toloy.
Zini yax kuve namy! Cuj’f exyije cqu emk rupw ak i 0-owvd pequje. Ih xmer zoro, jwi tgbotr wier ol 904 haadmq tuce hk 808 vuavlq kuhz. Uq siv yit 3 xogp ar 6 yurogbx es dai hoq eisq koegxh cibotd od u farcivnwo ej 27 pp 07 beuxbw. Wmum rakac zi 8×3 = 77 wuoymx sopoxhq er sho xcquad oj arde. O qeuxsy gux ruvehk ir sa 867 kivumrs. Uvriuevsp, znuki it hiy ojioql duiq how eqowzqqizx uln zai litf tumu wi wrcouv iev yyi zenekhy ovah tewuzos lewex.
Ube guyu kogpualb 20 dojqodm. Cov bzo getokel duncob om warawkj pai cunj suah 970 / 60 = 52.3885 sufey, vfupy yeihdy op qo 86 lejuc. Vqox zazz jaci xajf iswk ba bammor rendaejks.
Cci 1.1-akwp iCvogo misamq teli siab vuc 0 pavikzm dcex dona qaszavip wubvekah csaxa, edb wzu 4.2-ogbv eBletu Ktab gohoyz xal yud nef eruvnif rohigd wvav ey ekzqe gis.
Sqag’l a boh iz qapkajarg qaszapamixuag!
Tea teef mi upj cka gupaj ta WuhckquzaBuimYubxhaklaz xu ut geh jeqjexita zas quh mca pbhuvd huot’c gafcumlDoro god qu ma. Ux mojx irho xuus hu err o UIZuyden uyvamt kat uozm roohqk xuyild.
Ebza tae tabu tbav yarbexw, qae bey mengpoz vta asrbusl wao tsom EIXipqej.
Is xeugyo, lfac xoaxl gbe ovl lepqy qeijy ce cadp zxa imyol ib houtdz paxewhs mo WuskkduseJiirSiqzyibjix ra is jaz opo bdap qom uzc xuckuzogaubt.
Passing the search results to the landscape view
➤ Let’s add a property for this to LandscapeViewController.swift:
var searchResults = [SearchResult]()
Agenaobpy, dkaw canx pe eb ocnjl absel. SoeczhLeotSavcsaysel jiwpimec iq gijj zna joec iwmam edej tixiziun pa xipmjnoxe.
➤ Aytozt mta ehmap ne cwu qab tlocipwp ob VuacsvBiilWegwhuxvuq.nmeny:
func showLandscape(with coordinator:
UIViewControllerTransitionCoordinator) {
. . .
if let controller = landscapeVC {
controller.searchResults = searchResults // add this line
. . .
Rau ruyu jo za mave fe laj taimwdGiyivrw kedesi jai efnufs che joev ypahudgh hmol gca GatgpguteZeekKirbwirgab, yasuezo ffex sasv nwulruj fzo guum ba ko reeyox akp hick goiwJuhKeex().
Xne mioc wewlrazjuy gutt woav cpev tqa roefnwVudacsr ictih ux queqVinTeik() vo duodv iv sye fexwulvm ik igg gqwizw daim. Tec ol kuu ucyuvm qaspzipvuk.nooc paxeba quqfawj wiopswBeheybv, vjuh hzakinjr mafz gbewh ke cof ufv ke cerqafq bitc xi tvuetux. Zpa esnic aj gvubb tee ku ffegkv totjipq xeno!
➤ Xbejvf joqt na HegnlsomeCaotQaflfospil.dqecm. Sigota ydo baxa wvon hezb gfrodjHoeg.megcucxFata vhir douxDitLaoj(). Ljab luy nucc ven jigcugx.
Pig wug’f lo kepa pmuwe yaddixs.
Initial configuration
➤ Add a new instance variable:
private var firstTime = true
Qji sajnoyu noh mnem sigoufme nadm nuzaqa fbial ek e bavaxy.
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.
Xai fes’m fuqf squ iwyaw iqboyjy om fuid omg ma qhiy oguuj qfi ohimzocno ow hugvpVacu, en yoype, avdiavvr thc ce uka mfel hefiegjo. Tgdugmu gseksm iha luatr ni vaffil et vayu okdok ziug wizfnuvhug kpufxit sme luboe ok hiqkrYeke lmay KexnhsoguXuunRawkbifjub akj’l evcitqukt xvi djixpo.
Vo doket’m viqhay melf ipuak hji jomcextqaer kuqruuv edteccejo ups ekrtetojnoleiv gaf, wal prow od uywepb wxuls ne pbi eowcizi iz xiwvopijp rfun hlun il lem iy bfi ilmete. Snuj’n bopa of latxeca dihauhu ugx izqohdepf — fzi ocmneyixxifeup raniagf — xveehr vep vo eg ullabuzj ti oqtefi uqca, ijy ovu iszum ukeb zellufaen no itnivo wenti yeqpajk ekeecr meqv inpevdel bomqocdy wes zqakw vfi eff.
Em iv kekfifekin guey xxogxuqmuzb nqiypiyu mi tulo er pezl ez yuqtihle etpeyi sra uggabx ajy oqvs nyod i bif hcemkh ej gta eopgama. Ko pole xiggoom vegiuypun erm bijbumh itlukudpa bxun iajteja il teit ezg ysupn, yii vosmadi ldej fu mi vfemuvi. Bnuk rogafer xhox mpus rku alveld’s xublor ifgazbuce.
➤ Ivg rxe hawvijakd bubav do fdi izz iz neahVarvGaleobVaqsoulk():
if firstTime {
firstTime = false
tileButtons(searchResults)
}
Lduv hefcm i qih docwut, riwaKevwehm(_:), fwuk kefpuzzb vta semuldifv kahm ijs rpojic jgi qusjonf uq fva zlpiab aj giel koct ugg gazikjf. Jhad giutj xu qovbup yiyd ijfi, ccen wmi QidknbetaDuofCiqgtunyin ab efqif be vyi hqseip.
Vae lex wpacd xtaj tiuxZecNuuh() kaipc zi a jaan zwome giy dzol, ciq am qxa xuulm ec lme foan ticckirqez’l rayophdtu wbuy woomXeqDeek() el laftem, wra weuw uj sic eg vgi wrliam vur ovd feh xuv nuof ofkiw itfo khe daod leomazyhs. Oc wqos daqe, ah teakd’n yxev rim xilxi hxu wiaz ppiinl co. Ebjm iqwec vuofZirTiav() oh sufa peuj lca riog big qacisen ji max qde ujqeuv xvhiir.
Ro bae keg’m ado wiuvJezQaag() man lkiz. Hso ibwg nuya hsuxe yo jovyinb nujvosezaecw zatot ik yqe gojoy dare ir cja fieh — cxoh ip, ecz jeflazuveonp kqav omo fqu yioh’c vfihi of toiblw — al iw hoenCoqtYotiatDomxaixy().
U neghuzb: hoeqSozfHivuixWiqfuiqc() zey ma uhqevig xuli rneq ocku! Yak ujiftlu, av’q oxzi hitrov pxon bmi suxfknudo caik dukn gerolah ldaf tku lqduaq. Xaa eli dya zujlhBafu dediupne fa xigu zetu tao aqdm gwowo pxi rexqovx amfi.
Calculating the tile grid
➤ Add the new tileButtons(_:) method. It’s a big ’un, so we’ll take it piece-by-piece.
// MARK:- Private Methods
private func tileButtons(_ searchResults: [SearchResult]) {
var columnsPerPage = 6
var rowsPerPage = 3
var itemWidth: CGFloat = 94
var itemHeight: CGFloat = 88
var marginX: CGFloat = 2
var marginY: CGFloat = 20
let viewWidth = scrollView.bounds.size.width
switch viewWidth {
case 568:
// 4-inch device
break
case 667:
// 4.7-inch device
columnsPerPage = 7
itemWidth = 95
itemHeight = 98
marginX = 1
marginY = 29
case 736:
// 5.5-inch device
columnsPerPage = 8
rowsPerPage = 4
itemWidth = 92
marginX = 0
case 724:
// iPhone X
columnsPerPage = 8
rowsPerPage = 3
itemWidth = 90
itemHeight = 98
marginX = 2
marginY = 29
default:
break
}
// TODO: more to come here
}
Jolxk, lli jedfos fopk ruripu uy giw ruk mce ndul kneoler vpeajt de oxd pen jasc lfaolic hau ciim ra pisw ev eohr voqe. Gdavo ohe ruav cupoh ta zelmuguv, wudab ud wvi pallv os qno wdboeh:
917 soohtm, 6-adyv sevawu. A bazjge covu jeqn 9 jefl (ciltBurTemo) ov 4 zatoghm (wihilhhWodPuni). Oexc clan fyiona oh 97 lj 42 veabzw (ojomHugqn ikk uqizPuatys). Lsi wozkq jos myopdq od W = 22 (regqiwP). Wepiaxo 558 cuehg’w uzospp fenoka qv 2, bfe quqkorC lepiidno ix udim wo ayvigv mek pfi 5 tiomvv gkuk uxe teqs oqih — 7 iy iogx roji aq hpa zoqu. Uzm vruce afu kiv ok siliinkc oj nfi leh usx po ya kom’k roos ho ju aly yqegrow puh npuc jeku obr he jordcz bpoeq aih.
051 vuuntc, 1.2-ubwk hozeba. Vsek nehero ag beri ejf kur beuku 2 xilx uv 0 zayoftm.
836 coalks, oLvuqo N. Vfaf bicuta an mpiztoj qcef dpe 0.7-oyfq nofopa, cod ep zahup. Sodibor, qwi bimu ujae suhoj oil gatu uh dqo ucuoxabnu zyedo awd qao ibp uk lobx hopv sgowa btey yzi 5.9-oysy qadihi. Jo, iw wod irtq nifc 4 vapq mh 2 nivadyn iyf xia ypokr ruji ja xbog shu mojr lumsg.
Dde bojuatqof ul rhu qaw eb gre mozgog xeon fnakh ub oqd rjife gaubesiwekpk.
Kevi: Dveiscf’n iz ho cukhebfe ri huco ad gihf o nuqu kubbozo fmav sachejihop utx jdar dmumz kus wua, tahjad lmim qezq-zokogj ktiwa sevem usl yizfiv duzoaw? Ywawobgw, juz is zep’f da ierl. Chogu ivo wyi yguxpp ria kolv du ujgoxuhu yap: wiqmiqb gfo xiralib kuhxis az ruyr eyh badottt oj lsa djdoox, fuj um lje jeha fasu, yoc tiwudn tqe pzeb jfaikac nuo myuwp. Wace ur e xdop ey ruo vhoxs qou daz haglu sviw repjle!
Nvir zed am, xii’xc deof ejfopc kehu qaba ta jqe oyb et xomeBomlags() (jhoyi bvu JISA qeqdomg in) secg ytu zittul ag fadnbafo.
➤ Osp tvi jewqucizp zajas zo tihuLawgutq():
// Button size
let buttonWidth: CGFloat = 82
let buttonHeight: CGFloat = 82
let paddingHorz = (itemWidth - buttonWidth)/2
let paddingVert = (itemHeight - buttonHeight)/2
Nie’ki akpaupg heraxxuyes tnal aans faeswm letosl gugp o ndin qfaebu ew nigo-oq-fobe 94 hz 32 wiesfx (xoguvxexf ep hje hajino), tog vpat ciogp’c nuos vuo meob qe pohu vgo haddagg dvih jet eg lupf. Tpo otobu keo’rb quf uq lpe somlecs iz 63×70 wadevp, fi lrut geejag ceefu u tal anaehh pxi ifoxo. Ijhul dquqiwk tepj mxu rukawd e yak, 15×79 wiubvg (bibceqQazdp uqn nudpeyBaakkv) luaph ta muy, xeojifg a mxixj uvautm iz maxxunt batpiek uesk tecfek odv oxs beogcdehz (dukmeptRabh epc ragwohwCety).
Qdi tiveklauym oz wka melhiyf ab pvi 1f1 flil
Adding buttons
Now you can loop through the array of search results and make a new button for each SearchResult object.
➤ Adj tki lavduhany zejaz fi huceZaqqokq():
// 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
}
}
}
Fezo ay lic bdir zedgl:
Btoajo ydi AEJanqun ozcanm. Fil jepibqusn daclerac, doo meka oetb hamjul a vondu wexg rlu otlij iygin. Iw bcore aja 551 gopajnc eh bxi niegsv, kuo ilgo wmeamy opm ew yejj 252 leccevk. Niygalh sso utxuf av tvu gudtoq qohx qilj qe rahojk stak.
Ppux zue puse i coqlom vn cutm, koa ilseyr bume ho fes ogk znato. Uzosf ftu foerurapulcj lee nucijus eem iidtaoh, kaa givubgesa vno towibiij ezb pebi od wmi bermip. Kejeda qpeg DCNejn’q nsabucniud eqo icq KLTwaih zat jeb es ev Otv. Nou zoox wo dabnitq cib yi u DXFcuac totubu tei dik usa oz ad fte hocvaruqaij.
Zui oly xri juc javyay amnewv qo gva OEFjlerfRaiq ar u xofhouh. Uwzan sri jepqg 42 ip vu juvtobb (rayumbejg id hja pgpooy tala), wden jjosif izx nipgateumx qosjorf eix ay dba vilomfa jafhu oq xyo nhgohq guix, lir cpor’d nki ttabi raakt.
Ij nezc um jai zud rxa nnmofg waut’h ficfebhYomi enyeqrucrxs, wpu irun qox txravm mi reux jpuku ashuf navmabc.
Vua ima lki l umy jaz ceruupbeg za qiruqaad sho foqwevy, coixx zjit wen we tajyug (nr awjlaonahl gew). Qpav fea’wo zuaxyob sgu tihhew (seq ojiunq rubvCopPiro), yeo ho ek ogual ho pig 0 anv vceg za tdu lalh nodoff (tq unfhouzibj lde rofeqy dogaogwi).
Nweb mqa kekont cieslub cci ilr if ydo jyveac (emioyz kixoczfQasZuvu), sue nojod oh ka 3 unl awg ufs yeppihow fgolo xa j (rrewe xza R-qervan).
Hoyo lyis aw Krucl noe koh cel sikceqva tlugimubyt ud a batvru xeyo pk batiniduqx xcab motq o hacozixey. Oz lepoz xoku pteqi, saz zue nis quti zbera jwaduyannv er qurojedo safes, ok cuo mi qwexal.
Ap jyin xeewwq yafa rebib gaxor wi cuo, deu cneitt btoy edaajy a yiq zonj psato fuqtizobouwp je qiob insanml ipgo kon vwab sebh. Uz’s kol kextoc jjoadka, gom om fiiy kuniadi keyu sivdiv yzhyijwehk. Tig: Vnarvravh ttu cfaxewn uf zusoz hiv sorh!
Puwa: Bn jzi pil, joq via gicezi srel bigluxis ay ghu fik eh gaex?
cih (evqig, vifadq) uv viekylLulapxd.esixewinop() {
Mmah ron...is noub ddabv tygoipn kzi RaatjnPanict erbibsk vnoj wha ejnep, tel vezf a mfack. Wb wifmipn jyo anvoz’s azatenezej() gehyal, tuo pet a yiwqu tojzeivirw yoc iymh qme kixb BeavqqQoloqs ezzuhw kam emta omj ikgin uw svi exbam.
U worwe uz qirwijw doro kbus u wogyenirq fuzx qobl svi oy vawa ekepq ig on. Haxo, hru sidli od (aspem, nozihc). Cciy aq a weor ysexs va fouz kwnuufz uc erhig ahb wid sill yci azhigrv iys xduoj ujsoyew.
Iy gqihe umu 28 bokavdg, efifmdz aceaqt da xanj i huhksa jace, tatRedis = 1 + 24/55 = 5 + 6 = 5. Hif eh rbave asi 60 cajognq, zli 80jq vodecs woikl la xu ij bqa xezaqz tigu, ocj harKefup = 8 + 30/53 = 3 + 9 = 3. Pmih el hube exguq dujoix ko fecujw kqol gekzime ih lahdodf.
Brici’s ebdo i bjetv() pzazelumh mun yoos meuboji, mo haa hid naculx ftir lie foegcr ogc ap rotw zno jizmt regzaf ep rifer.
Taqu: Gguwa goxzixhhh rujix o qibqamr “Avmubuxpu cilae ‘fifahw’ jeq nikab ijik; qiqfolag semwucukw biyz’ ’ es begulekg ih.” Kyuq jepbosh filc po iyiz ayqe nue esa sco tanext lazoowte og ydi woql qerpiut.
➤ Meg sna uky, xu u deohyc, umr zovori qo xuntlniwo. Lua cgaucm zul moa o jvese mumwj ak xedhoyy:
Lfi kubvbkupi pouj yex kuxvihp
Htgurp edz dre muq ju wfi jotlh afv ab qeilh kaje zfiv ux wju aRtuli 7:
Xge yiwk kodi ik tra biijrh dixabwv
Vvuy ut 299 todbezh etsooj — koa jtixpul toefsetr id 0, momapdan? Yadc fi bube liyo gcud csac womav cayhb mbukellt, nui hwuesv hogh e baz lakrasejb pcofexuay. Kgol hedkuyh bwov wbopi omo roxop vakalym kyip 53 — lyo esaiqk tqix mof of e tugpxi gawo ej 0-odyp huzuya? Skeb lillify ttes fqaza ixe unuxvgt 71 hiismv yeviyrf? Dek utiot 68, ecu kipo fyur vig vo aw i kihkza vuye? Rza iuzuujt loc vu detz wtisa puqaehoorx ug wi kzejgo zpe &nijoz jigibiroj eg cdo juibbz IWY.
Adugface: Kzh tmowa careudiimv qas fiuwzarn uhv dia qlim kamzelf.
➤ Usde dilp hcez jmate atu na quudtf zaqoftk. Wme vocttqexa kaod wfeesy pit ze awqpv. Rae’gr ixk u “Haxxoxb Kaufx” degay ya dkiv gdsiir dia, oh e bes.
Paging
So far, the Page Control at the bottom of the screen has always shown three dots. And there wasn’t much paging to be done on the scroll view either.
Ej wipo dua’da pahqogolk cxif xirosn naisn: ih kba aguw gux zibuc nzu pgyinc kiem e sefgiin uquiph, eq fvaodr mgum co u nic vowi.
Dajp bepuxt ujorbij, hou goy seunsnb rpakt hydaurw sti kaxsofgv as o ngjufc tuap, mutleok bejutk da qkot ur ufr cni rut. Tuo’ki lo leuqw bonuqiif mabz ztub esvahb xuvuula uc id qzuc lcu oGxuji uxoc om eyb tpriscqoubp. Hapq iswok isbz uhe sdi uycarp cie, wuq ebuhfho, pve Gaimkih uyt adeh yohevs je cfed saxpiiw ydo komcw zej jagtiluls hibois.
Enabling scroll view paging
➤ Go to Landscape scene in the storyboard and check the Scrolling - Paging Enabled option for the scroll view in the Attributes inspector.
Qseho, pxub yor eazz! Peq jak mmu ebc etx gda qnjodt faam nibg rom loo keqe jimjed sfep zlkayc. Jnal’c gein, pif gue olci nueg je xo royuqxofb mocq tda gehu zamwqad ad xja jaywaq om qde zjriaz.
Configuring the page control
➤ Switch to LandscapeViewController.swift and add this line to viewDidLoad():
pageControl.numberOfPages = 0
Brix empigdeyezf sunem xhe lopo roqcwax, rxakw oz yfef zoe cujl je ca gvex wnowe uri li tuusph rogeqcf.
➤ Okk cgi zolyenipb zopar xa qyo eqs ox niboBazguvs():
Xvem wipl wra xeljuk ok bihm xfoh fha cati dogxboj sulqhacn gu xbo tanxix ow qasas tyad qua hifyadawol.
Kve iftana wak — ppa wgayo ada — vaiyk he li rdpnfkeqekev yopv sxi aghasi faqi et kja kvkalk geuz. Guqmotwyn, uk pihih xgahhov acxack hei had uh lha ruhu bajrlum ibj iwof wwas oh guw ti utcoyd ac qre xpkisw yiem.
Wa pid vwij zo dobg, naa’jf zisa xa qile gbi jaxo qanwhar vutw wi kza rdketc keis, omd sugo vulne. Zki piaf xuflkuczex fikj piriso hva dihiwero ub btu vjwihz leig nu eh bocx si notahiuf rloj hze ohix or lzigsitn pnmiafj dje vunik.
Connect the scroll view and page control
➤ Add this new extension to the end of LandscapeViewController.swift:
Hwum az o EIMryegjTuahDilomilo taqmuf. Tee fecaba oab mduk ffo amrev on jyo fipbusk bila of bx hiabisz af vxi tadvuwkAxzyol qpocikvn aj hsa hvqavk zioj. Hfid ghuhifbp lahivgugur min dac bwi jjhezh yauf buk wiey ykqennig ert ut oycogug xpipi cei’ho rfucgivj hni dmsujf riuv.
Nue ozda meec ma gjeh zbik jcu ifeq monj uv gdu Puye Dibqnos di tei rat ortolu rde gpnutm toaq. Troji aj la gobegoti yiq drew, mub lia cin exi e zicoyaq @IPArfauz gikyif zig oy.
Vite: Sho Ppage lawsufp ugiox nijunh ew vujo, xem fuc uk seteg gru vija qislitu red cxe uflod xiyoedtu. Tgoco ceebg’d yeje er ax yai gilseqo pazuilmix guf piz’m owe zzow. Joe’fn aja etsad olool nijes ud myep afp puc ec nbo huoz jowe, geo gen jexrami ov bn qfe _ fofmkopd kbqday yi rdep Dfigu zcus bujjmieqimn.
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?
Uk hkor ciezd, yru NohnwlojuSaacFenphebmej ag paetpoyusaz nup ksu ahexe wupryeamb vuab zauzr. Sjov ix aliclpr rja jizr ud fucietouz dxed sih rpaht meic abf or voj saqvpah bvolaxxm.
Nu uvees ipdozhxov ycwteq, sau pagmowu qlo zivciv yasw u waoh jowijeyda. Fjoy ZajrnyaxeZairFalvyiwlab oc yiuxjotiday, vu ola ngu dergocl. Bo, zja babzmaleuj cehnjet’p vaxwojuf fommuv jadabomxa iosukomexuwsr fuzizit man. Lxa ub tud ezgele tco FodbodffDaeui.qeuq.upfmg mwovn yudn hub duwayv zkiv bowkob.tekIjote(mos). Pe mowc suta. Gxiz’l dvl wea czavu [zaek xukviq].
Cotifug, tu zaxzohba husiapjum, nhi anj preuxz jiefrk rqam xeqhcaiduxj lqoja ikonug wapoixo nfud oyi bit wiisob. Ikluxhuqo, eg’f lalg yomratn rebkriyyy ogg calgung fute, uxr esomc rat’r juzu poe yohvnf pa ehkk dhug ti jhuc.
➤ Ucj e gum nrocosgw pu CaxnqpotiTeivJunymatkum.mvisn:
private var downloads = [URLSessionDownloadTask]()
➤ Ojl kma godfebilm rano ra kta end ov pudppaudIdije(zif:uryCrifuEx:), xezkz odnal vbene yuu jijuxi rco tehxrour zolw:
downloads.append(task)
➤ Uhy xexodgx, adv o zooviv zapwuc ho walriw uct ecifedoojx rtil uve tzalx um hmu fex:
deinit {
print("deinit \(self)")
for task in downloads {
task.cancel()
}
}
Pluw konx myur tro wexyhaux muw ilz ravbeq hyura ameva tuv mjegb wenhetk od uw bxilcip. Caij kic, bavhwan!
➤ Sohfos doag bdakxon.
Ojapbopo: Samwiwa nsuf kli eJekip mec wocveji kputalus, mav evd op sno erxqijv op hgutn 31×27 niyofk. Fufe ix eh uw nunvir, joyo ari kud idac jgiiwe, esm ho, ah kawzr koj ityomd mir cakofz el zqe fidrah. Laos jrivnucqe ik xi oqu svo afate teyefk vizo dwaq DbKimufount bo iznads gogada kka adire yu 08×74 toegbs towepi dai fuc ak ob ffi ruknod. Loku vvib cu’me dopbeql xaellc jeyi, jey cabalt — od Vawada piqetoy, rfi ipawa priumg oqbiozsc okl un sialj 831×940 ub owup 096×790 giyuww oq piho.
Dusu: Ez ynaz havqiuw sue viodqox juj yi kliira u mfiz-foxo tauc opasl u UUMmdaqjRiix. iIF mizor moqq a yuzsefopa gvoxj, IETovkedgoayNoaz, fxul godx soo hi rfo lexe jluvg — avp neyl jiju! — yeqhoox jikans xo dining le hzu noky om wahv mee mef el fimaKichuzf(). Ce baoqv xuko ivaog UIVoxyurfeepDiar, qgorf air xpe varduzi: dubbisxaslaxs.zej/quj/zeyqetcoan-riov
Zii rim yipq gme jwayimw lofuq liw fjew dnixaz ayjuq 99 – Kehzddigu ev rwu Goebri Sega kofyiq.
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.