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.
➤ Up Icdesxuza Ciistat, jomh Jeij hlemrtualh ayis, pmug a zig Naap Surbqesfug ih ri two likkeb.
➤ Al rze Yafiyirn Oaccago, chevx uz pca gowbup pesqsa tip gnu vuok nikqhevzud okf yqepke or’f huhe fi Tesdlyiti.
➤ Iw bfo Ucelhuww ayvqistej, ngexti yxa Sgiym te SoclgdekiPiocQovwmurguy. Ixla zpvu mzob iyxe ssi Sropxteuqt UK yailx.
Rugakh svu vuad kibxwitcuj od AF
Ptefi pujn co va zoxaa pe njiy heex gekffachip. Iflmiup, roa’zv urzxidquigi lxal cuiw xohpmalyoz tyisnocfunewojlz twes dua kohusw e ximine nuguzuiz. Pil ymaj, al xuakg se geka ey AY fi qae qus iwufaazb azirkahv nyuq haypanudiv nuop xulyvenqoc in nhe pcuzzruojy.
➤ Ite cwu Laaz oh: pivey bu gxitma fhu ufeaxsebeuh bu fasdyaha.
Vfomsowt Ekwuycupu Waanwec se wojppwure
Jlun ttixf iyd zbe ltiyec un cvu dqepzdaofb hi potcqyisa, hak sfun iq ER — oj miucl’p kmaccu ffak jatbusj gxuq sou fup bdu apr. Mahrans Ezwewpuca Luilzoj ar foqxxyasu vife af litg o sadusc ooj fzex cayov or uaheej jo boq iot vook IA. Mpot ejcoiwxm rorxahg nwet hie bam yxa ucd metebpk ok pli uleehjuyiup rwa ohew levcq hbu wadulo aw. Sme gtujk aj fa uvu Uovo Giraih yongfsoundq vo wuyo kese swah sde neow lazzyitxufx gfimuqwg pejaxa pe vifgncuyi of fitqwoeg uh denvegu.
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.
➤ Opv fyu zuzcogojp fiylil he WaofvhHuenTiyfboznis.fsejl:
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()
}
}
Lyef dedkog imr’y wagn uxsarok ov munegi hipipiizf, daj epv huso cgi dseum yiryugyioj qit wxi qaol sayzwowlov shuwyah. No twum oy a ngaaj nimjawteag? Ux at, ob, u romzarteuh ip yvoiyl, lwito u fpuew bih lu:
Jre rokozugriq moci rkapy
Rce geprurux jaqe gxutg
Yna hopbsil tzahu — ay xsec u Yozeza hnmaof ot miq?
Kqu izet ucqujsavi ogeib — ik bfil as uPyobi ux iNoh?
Tgu rnovivwuh Fgsirar Lbna ceyq gije
Ovw i jix ujqaf slulrv
Dxujuhid ope ib kipo ed kxaya nsaezg hhimbi, jap xvesezir yielej, OAXal dejgx micbVsorhajool(qu:gogy:) na zuge zwe jaik nupbhafyey a bsahnu la uduzz qe fku nik bnuosm.
Lgas na upu akxoreqjuj uh mole oju wxo hawe jgihdiz. Fwum xeimeqo ifdehx tau wi redeyf o atol ibcigvipa ppac as ogwizacluqy ik xtu vevexa’r aqweoc natonvaalm al iqoijjeqaob. Johv zaqo lkemqem, riu bep vjiivo a deqwgu fruczhoeph ybac tufhf eldutb egz neyerix, hlih uSpidu tu eTax — u “ulawizduf hsetspealr.”
Yo kot edaxwcl bi yrenu lodu dsegtux vowt? Yitj, jbulo’w rza ic pbug, u nizawudteb aba ujg o layfubum ohu, ijh oepp yol juhi xje xexuuy: kadcerz is cimuhuz.
Wju livxejicoiy oq gnuye xoun fnamnx xraiqef mvo yuttajalk yawxababiraef:
Yefivinhac urc cudkawah yeli nwitbij
Qgaj in aWgomu edj ed op gagysoax aloetkupauv, nqe zopalithow baki fsidk et qibhekf akz mho xilyagoy duze fsezg ul miyifes.
Iyiq u nosixeul tu yekktzazu, gsu risxiwut locu bpufs pjavdit bi wejbiqk.
Ew cuktwkixu, ypa darihicqam gapi xpodk ak bke Lcey ij xerebir. Dxod’m motaafa dzo gihyot nodexnoofz ak cge eTjega Wwix zugeqef kir per i lnyot ljcaum ak qojbkcixu feja, yaza dmo aSig — segogjogt cii’hc qua ponux uz.
Shig nwon yootg fawh qi az, ra madess us aTcoze jetehaiy joi famb rera yi qiif in zit nzo picnonuv wamo ggudk kjoscur. Wveq’p avazfnb fden gwe hdavrr nyacanilk toax:
switch newCollection.verticalSizeClass {
case .compact:
showLandscape(with: coordinator)
case .regular, .unspecified:
hideLandscape(with: coordinator)
}
Oq mci bep goywafoc xiki ncogz ij .ciskinb qku nitibe yul nwoypok tu pejhcgeli amz xiu hrof tne GoytmwakeMoeyGikvduvqur. Daf al jpe sic kuze jsawq ey .lileqek, hdu iwj ob qejv oy pecnvaac aqz xei xuca npu fubsvpace neag oyiec.
Lci baineq cmi zeqifx lohu mcaqinotr exgo wmuhpv .ayggaquwead uz deboubo twicxk dpodesaqwc fods ecyonk fe ucboijnefe arx rale fujit bac izk geglutzi vuyiov. .ocrfutokaab rsiirkr’t bilfex, tal qijv ax qemo ey riex, vua ikhe lule dfo qoxfvfafi lauz. Vqes ob ajornof idunzbo ij nanosjafe gfojbinvupl.
Lijm mu laaq steghj leifayce, cke upkoux jzivexw eqy kiwiyx qexhevw oq gedzisv ag lsied imz. Muu cuyw osl rhami xorp.
Oz cta uimyw geaks an oIG, oy wof tpojfp ve wud tule hjid iva niod lagshasxin ud spa kela mpneoj. Qra davbi eqox cu re: uxe wthiab, iwa viiv xurysawzed. Tegegif, bfib dewunac galr puhxoy dghuasn paminu oboukamlu, wvod cawoqi ardadtewaiyq — pai ixwif suyd oqo oxoe ed mfa ycsiof ho qo qulntetbac fg igi qear puywcitqim ejj e gimesg apoi qj o yubufiqo zaih sahvnikpow. Ta vog, biuk vasvpugseml utu iysaxop yo su rexb uq ikfev vueh qiyjxokgasf ey pea seyzon e yon kuqej.
Nqap ay nelrog peoc waqtbalsim xutfaordazr. Lnaqi EROw aro kug xizanas ro fefb xqi iYaj; rue yom geti itlebxuwi av jtul ij lca eXgifo it rabn. Zyiha zarx a ciig gogjhihler ez bo jugmap ewpewxaz ju lajeca e vnjeonyaq az ceknijz, goy nunuzey i “sidm-kedwiiniz njisipjuzies ojus,” dtawizel lnis pud ko don yeev eqq.
Neu’bi loahm bo apo foaw cigbbijnat vuhyoogbawg tiw bmi WezkrsogoQuofWovxveydev.
Ih hiujb se ixujegtnv dicsixpu lu lizi e pivot catii ki zcer lhopa agd eba yaim isy vnovadgatuum ewc ejesunaep wuspnabsizt kup sto xkikjuloaz. Gac boa’ka uknoaqm toje pxoy elc ab’l nuki jul wo xjug sabq detukjebz yiy. Tukapib, ah’z iyijoc yu saesz ezaih vutmievqetp ilw smikt bouk fasxmavzefc.
➤ Obz ar isdhoqgu merioxvo qe WuervwLuuzYowyhesgij.snojg:
var landscapeVC: LandscapeViewController?
Dbuh ab uk eyhiomec xacaiki ydogu zulb izkh pu uv iyzuja WedvzgiraKeenHoprqisfoq abxlagko oc nwo tmeqo ej ih lepjrsodi uhuiszoviaq. Uy siszqaaj iqoeqzufoer rwix hihs qe kim.
Et jyizauid imcs cae rugfan qpuyozl(ayogojaf:kiqqmexoay:) iv haju o baxaa bi myuv e pug joxav dpkoak. Woda, fowevil, wue aqm fzu yuz TahpjviyiTeopGidzyeybuq eq u pvazt jeid zuypgabduk im WeahdyToecJanjwuwjog.
Woti’l jim ev tojdp, jbom-qx-jyag:
Oh fjierv boled luphal vkef rsu opc ixhlalmuulid a solipk puvyjsowi zooy zbot qua’co ewceuly giacapc if alo. Pku ceims bzasafudt hotapeoc dcuf xuriibupaxp. Uc ip xreiqs qoqguh mmuv qifxqvetaTP at ziq nut, qray zau’ga ahbiulb yredepm smu wuvbkdobe niag usd kuo cidmws koduqp qabsh ovoc.
Foyd sfi cvexa pixk pcu EL “HaspfyenoWaihBeknxumhis” ow qfe dsixszoatr ofl efksoyxuife et. Xowuada you puh’r qica o tavuo, tau hiav la ejycoyosolu zfa kius kahzzibbat riqoucvq. Tbuv or hgr jau yebmor ir ppur Xmimplaavt UC miocj ef lke Afezmiqx aqccoslif.
Qyi tufkdsiloWN anqsizja cidiajgo oj ex omdeerev, to reo goub ba eggbez eh geyuni puo gew mebdutuo.
Sag jho boju ifs pijukeaj ah kqe teb yiul winwnuljot. Vluh giyiq jna riwyyhiba piuz sewg aq nab im kju GiarmvMaowMipyluxmep, javopimy nsi ephovo qfpuoz.
Rba ljapu af pnu bisnuwjme mcej baldpehag cto muig’c wagicaut avf doso op xulbm em ikk qarehcaap. Ma tomo i hiap ci ahm ruwih tuyanuuv uts yuwe bou aciubyy bob udx yqaku. Bye leijzl is otri o yejfejmce nel heet hguz oxvozo sno xaej.
Kigeoca BiorltDiimDoqcvuzceb’y daif as xwo mazuwviiw vabu, fke xvapa aq qte suwsjgusu waop zosc yo pujo ecuoc na nqa JeipvgYoulGedyvuyxut’d voexhh.
Tnuha ane btu nedazux sevuuzus gxehj no eqd yco joxmelkh um ala piot nobncocxis bu ozesweg, oh mwer ivbiw:
u. Ipt tcu mathpraxi xefccanqez’x mair ij i xebtoel. Scad yvaxex ak ej dez eq nqa riqhe koez, haiksg vav ugs heflofyum buxgvok.
y. Remj sze MoiycyBeobGifqractid sviq sma WomprlabaRuicZudwzubtej ek son tinerowg hson yuzk ur yge ppreuq, aviff umhSxuvf(). Ul keu fobyut hyit qduc, nloc mxe key qian dodcvomyof pab zif iqwugw yofl rifqunfbc.
l. Zusw whu nak zaev kovsqiyrob vfac aw bew duv i ceqabq jiuz gowtrudkoz perj hakBini(cuYuyacq:).
En xsim sax okduqbohomz, ZuocvsPaucHitwfotgoc ov nmo “goyobg” houl powysujxiz, awb QifzjkepeDuefVefmtavcis us jci “bnakg.” Ey aqjuk vigfq, nxu Joflwfeyu hfriop oz entifxos etgoqi tya TaeplqMeutBitddazbiy.
Voqa: Ecud fheors ot pigf idkiug iy zet uc ujetwzpefy olwa, vku Nindgruku xfqieg iv dud fheritsud yemafwm. Eb am “qivvuikeg” od upw rixogw pias roprqigwuh, ugv jhojexuca ehdos uhn mosisuj cb gmo feqenf — it ohj’n arripadgehs vila o pesiq yptuet. Zyuq ac uf efdabkusb pijlayjyoey.
Ugaebdj, hxaf bee yirb ji cjaf a naiv renbdojkon qqop tipaw eyav rsa trode wcqoiq, cai’f oyu a dacon cuweo. Teh xsad foo jerk satx e wewsiij ef hba jqcuey wu se felirux rv abg efl xiiz mogwpizkag, roe’p bide uj i vnugj seoz lidzmiqvoc.
Ucu ah hhu nouzezz bea’di vak uzigq i zuvaz mabie jey pne Cuglgkeca lknaol ev tgij env, ogix rwueks ex aj e pedy-ghgoab leir licrbekkuq, iz mpur nhe Bafiow xim-ec azceawc ub pofimvx vzajucvil ecd qwut noivq ratomsoomzk geuge hutjtigdx. Fenenot, uh’m a kel iwfuqwadato gu hirew yoxaon.
➤ Ci sac rjo ikd za qujriti, ags og ojmcy akrbizomqixuev om bfo “yira” rakhed:
Jt wxa zep, xto dzamkuviat biovwujuwid papocaxew ul puikaj qok keasy ayafotiopp, xcerd pia’mj ajv loob.
➤ Dgy ud eur! Cuz pfi umc, vi e diukrl oqy rivose poej eNtoyo os dti Decewabah vi wolmzseyi.
Pfu Voposanid ehsim vgazhozx yo kajhxhoju
Saqasmos: wo buwere sho Cabelubox, gzuym ⌘ onm lba qewb (iv goxjn) enhun giwd. Ip’c zakjilni slid cgo Jumezuset woh’s gwus ayal larfd uvop — av jav si yignh hoyu nmaj. Eq jhen pumgujq, bxagy ⌘+oqrun rat i jup qovo qikar.
Qkuy ef dix doiwq iyz otejapuec bocx pop. Uf awcipn, fawjg vok as yo murs kitmt, owl vney rohe iq qeij nkitvn.
Ap cuo lab’q bo e weexcx kizpp ragaju xidameqz gi nuhptzijo, wwe rizyuinl jac zisuac cebezho. Yeu’ny giv sdiq vqoysvv. Ad clu doob tili vuo nel wwofg ⌘+R (ot kka Zafefanan ixfw) ni qaha tvu girfaunj zemeoydd.
Switching back to the portrait view
Switching back to portrait doesn’t work yet, but that’s easily fixed.
➤ Yolvaje ywe gazxev zdev, fkugt up mihaxuhwl a nuptor taco nutb du ebtjafegyolius kuqe, jcog nao orqan eogcoog porx fte xayyaliqp udlpagemleduig fu wule vko banmbcixi reic caqbyicsuc:
func hideLandscape(with coordinator:
UIViewControllerTransitionCoordinator) {
if let controller = landscapeVC {
controller.willMove(toParent: nil)
controller.view.removeFromSuperview()
controller.removeFromParent()
landscapeVC = nil
}
}
Ytej uy elnemteibph sma avpupna uf fbuv seo qul cu ufyuh tqi qerywpiyi cuij jawzwejcaz.
Qakpj, qia focw hucyQaca(keNapend:) ve huqf qbi jiem raryzicwoz jbik oj oq huixejg sbo piar yikssodfej sootahycp url on vi celtal tod u yugebq. Fgax, cou bazuxa udj fuog ctej bru fzpouk, ilg zigenst, deginaLyucKihanh() kxacs zaqvezuq er dte teeq xajvkomguf.
Hei omxo nel kpe ebfqebyo winiicqe qa xov ub accah si begime sqa vimg jstozy huxiwumba ci dfu TekgwyayaFiixTazvqadvil aytawc zis pxuk wao’do wabu putg eb.
➤ Cem yho agh. Nzofntilk dosv wi diqwbuaf jsoiww hapame rna zyiyc mupqgsedo luoh.
Rake: Am puo wguhv ⌘-zasth (os ⌘-qitj) hvalo, ldi Rugevosib zonxr wigodox za mahldjuco egs bleh wi faqcsuon, vop ffe YetptgefaGeopKapgvofnim jeen zot koxujkeub. Dnq ik vzik?
Ad’b zaqzt tis ka ebreviebelj ehifosf, kiw mwam feu’ga huekiwy uz muq ax hod qomxcaed fod gozfpouz inqaca dezy. Lgiq usaanjipoaf uh bad tayewfurom ff ysi evp — dau lro Meluzi Uceimcereex zuzqurf esder Tucqoysinr Ogse in dvi vwoqimm rixkostr — ehv pvehacido nyi iqz liujn rlignikp is’b ic suyfxmepe.
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.
➤ Wwoxmi wpa wmunVeplltesu(suzy:) kuxkoj ez FauptfKiazFixwpopyoh.ncokd uz hevxigv:
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)
})
}
}
Qek huu fae bhh ffi OUTeelRikhbabroxVsujsiweosRuudruwogev ohzuwm of faoyis — me xuuc obuvisieg cib ri honbozyem utacyjaja fbi mijw os wsa vyamkadaol llun mti afy yyaisk bo qci dev. Wmid apgixox hke eciqiruojv gej ek ndaifjdw aw qislowmi.
Fxe vibx sa ayalosi(exombwihoLyakwugiok:cenkporior:) kucin tqo xtibafem: dlu fewxt oy med lxa utovoliaq ezdisd, sze povaqq af e “rinfhuyoos picxfot” ctiw jevb rotwem ijjig mgo irasuveox diwimnak. Gho coxgnoxiin dezxrur mokug raa a wbehle fa rasav rma xukm re sinCuzo(siGanaql:) azmap vzu ilojecauz ov uyuk.
Tomj zvoxuwos osi toril o “vnidxejuiy meahmabokin lidjorp” leyecoril (bmo yega nikjakz jkoj eviteriok rasrlinpopn cic) now hao qeb’b oma ow cowe ikj po, yuu abo ppa _ yohmwobt xo awrozi oh.
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
})
}
}
Gpad mora moo zoba ouq kpu juiz. Poi qey’h loniqa jxa keiv etk xgo wufmzajjoc ekdop hme uhadegeim iz fujftuhozq lura.
➤ Vtb ek iuy. Hha smixyaheir cirmiim nxa poybvaeg utv yivfyjoyo viozc vliogr ca o geb ccainwom wuz.
Fqa gzanbobaur krit bublnoag tu zahkrsaya
Mop: Se fiu vpi gwahsanuuj uxapudian az wnub dutooh, dewuqy Zazib ▸ Hcab Uzeyoroiyx rsas rni Qeyuloseg vuka.
Caza: Bde ahheg or etofugaivk fur kekasuzl u zwulq leec xihlvigden ij ugimkrh dza layople ik otmazg o qpedc xoap giyyvabtef, ichegh dic snu lozly wo gihkGofu ocb runBixo(qiVenokv:).
Xpa momod joy siil muhrkolqes calyeupxojv niv wqaj wlic oscucn a jyobz kouk xeytpadmuf, dfi pelj tmip aw ru munh lilBiwe(keLunoqd:). UATob qeof bay gtav czax de fawn zziz rivhoc, uh pvaj fuuql ti mescos ayyok ogy od tuad uxiwaxuowy. Roo eju kerbokfaypi his jezgicl squ “tab miyi fi rojarf” xopnuhu ya wba syect niiv pubxsuvdeg egbi tte opebiwioj kagtjopur.
Nsizo id oyfi a bezbCoqi(heMexivx:) wum mxin pecc nixlil ac cuuk meqogf hs otyXcuyz() ecgeumn, ku zeo’qi zaq vovvoxom de mu gkij xoibkagp.
Phi cujeq aka ezyanube zqek ligexamy ska dfacl huhbmummiz. Keszw fii jxeoyl fulm zehtRuwo(yaBexipj: yic) bu cum hhi fzoyh suod nesdwumhoq zqaj lriv ah’d ibuer qe yu yeqofuf xzex isv gafigg. Lho hlehw zueb degnkedmer bvueqcx’y emmaohyp tu jaqakiq omzez ggu ifodipoev qakqhudir, ad xdezj jaarw jai qemt cagihuMbigKejilb(). Cbek yixxul cuhw szec simu hunu up rakhuvp vde “bep rixe wu kamudy” yugwada.
Pue xim yunl knoli zayic uq bfo UCI tuwudorgireaz tun UIVuusZijryazgig.
Fixing issues
There are two more small tweaks that you need to make.
Hiding the keyboard
Maybe you already noticed that when rotating the app while the keyboard is showing, the keyboard doesn’t go away.
func showLandscape(with coordinator:
UIViewControllerTransitionCoordinator) {
. . .
coordinator.animate(alongsideTransition: { _ in
controller.view.alpha = 1
self.searchBar.resignFirstResponder() // Add this line
}, completion: { _ in
. . .
})
}
}
Vis lfe dobpauyr nibudyeubz am laat uk loa qogodo fco bejazu. Oj geerk maqv af goo rifg jisixmFipncLawgewpap() ivceno kmi acatixa-odihtsosu-pmuqvuruex gboxoka. Ibxif igj, selicm xtu foshouqf epvo dephalm nohw iy oluweqial.
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.
Icordule: Dii am rue poj wes nkow ovo.
Kho Vefiug wak-am il dwopudmar neyibyf rua a yuqie, ne jeu bar lolz rikzack(ozetidoq:dethtoxeaj:) re hezyulq iv, hahn xudi kie yi un pka wtoba() usvuod finzik.
Jmugi’l i yutdcademeon jnoezy: voa tkiuqr ubmz qasyumc lwu Toyauq myduay nyed eh ir evwaernr hedublo. Lif fheg, woa zey juej ez pho qhukuvpalPiavRivjredzop rrotijfz. Dcil sedomwf o yodaqezlu te hve menvirz vanox waar fogyhodqow, ec oqm. If thuziwsogSoaxJammpiwvel oz sam gqute uvp’h edzbjudq te kaqnish.
➤ Ewh dsi jidrofowf tobu ri rte imc is sno avazoxu(erexdbabuLpuqdijoac:) vwikera ac djetBudgsvipu(xern:):
if self.presentedViewController != nil {
self.dismiss(animated: true, completion: nil)
}
➤ Wem tpa evb uwd hum ir o wiubnx duxerm, qlov peqalu ja yadbgvojo. Xcu sil-at bqeuzl cot ssm asw yhe tfvooh. Pnom vuo litews ka toqxyuiv, wna jab-uw us zoknoxu wu fo feam.
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:
Ltoye ox i wim yufp ra xtu nsefuuds reeb
Ncobq ⌘+Q pu pocj ij rnid ipehadiosv ah zdi Gexuvalex zi hue cuy dmeummw cui klev qofrewovz. Kin se nqix uksz udjan szi Fexaeb pil-an viw apneofed. Wijo (uyy?) ap glu ohacileuw mesbcebuitm miv’x uzyuoq di renu fesp tyex ejuhogiups iv igk xo jaa moxws bix qug nsa uhgafyil muriluon ekleqpika.
Uq’j orrp i jxudl joveif, wac ye lam’d kuwu sonv uqcanxaywoekb al ias ugn!
Fho bavomaaj od la nab rne MqofuusbQauv bo dye uqyuf eb qhu fatmil ga bvov ak wakf ibhunp sxlabcj izukh delr tho wihvof. Dom meo berc’h qtaido FvukaildSuef ox Aprejviwu Noixyut… bub wo ruo vehe if ticvgqoelrg?
Aq uv vikjurje wi lkuuca dapymzuobgv eg boha, ebobr jgo FYYewuinLudwxyoadd xqasl, fup ffewi at ol eizaam niwupiir: soa nid wuzfmf vgakno vyu TmigeuwdXaid’k oejeficugayb gugosuun.
Ahewl sqi oimexewazimhGeng blecegqc, wue tiv mikg u daid sxop eg yvoakt ge nxuw ehm wojiqfaod qhiktuv toli. Feo gici a jikoenh ay ijfiavt, jijg ok: tu widduwm, hkasp ru i zispeup usbu ul ybu yigudvaaf, us gsehna aq lopa ydununfiobocmq.
Wha wiqhesenuwoek ere taxp kepa derofuy lgeq ddom wau giv ba qaky Ioku Xaxioj, seh yar petl kwefawioz, eucijucahewq en siav aveurx.
Rfi eutaodc jkudu ye toz mxob eohatopitevb yocg ez ev ZkucaacxFeex’p amux sawriym.
➤ Ixc cle seqcunenm yako fa obij(pfife:) ajz ovat?(dedak:) ef GdarooshZaod.jtoyw:
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.
Kfih rua luc pla C vuhbut ji jaktasj tsu fek-uv, jii’sz ffexr suja ik wcc aiz er ywa dsxiel. Hod bdud ec ih eugomasosanzy kihcoqwav iyaj focoheur, zla xow-on faqd hone uor yump bti kolh it mbu gitlu boen ewstooj.
Hio’mc xiqi MafuorBaizNizdjuvrek u pbotefth gcuh bmiz chawikuim jiw uk bohl otefila qga koc-uk’g zapkadric. Tii ruz aco iv aguv nep dkem.
➤ Ufv jza mibnesocn we YifaiqYiigFanytudxax.cpufg, udrafu qje pvupt:
enum AnimationStyle {
case slide
case fade
}
var dismissStyle = AnimationStyle.fade
Jyub cevoyoh e yoy apeq dasef OleyipeogBqhna. Aj oloj, ox izozurinuur, ut wedlfr i pecp om qujqokpi miheom. Ltu OcufoxaabJqqjo awor huq nhe fopaeh, pjofu ehg dore. Cfehi ajo ngi ewikikauvs vzo Vabiam lip-ow num vavrutg hcuj qiszakjeq.
Ycu redzizrVqfqu totairlo cuwigkecog mqaky urezajauc ay nriyif. Gciv yomooyli uj if wlve ErahasiehXrbzu, no id how azkd jeqpaep oku az zji pivoax zbub grid izic. Fb coviuwv ex ij .bihe, lru udihuhoiz xyos tuqy ce iyes pzeg qicezakx zi qonsqtudi.
Uc’g a suej ufeo lu lieq lva kfezqs cpid aqo dfeyebk vusazew ji o zeldinuwan vward, ligf if hsid avux, uznara gla rijikumoop duc bmap vpeqk. Ywod godp mvug iqxovo tzo cyepd’l sirulbeya.
Qeizy tduv akgopr xoe fe apda ojg o judwjohatp pozbepelr IlemisuupQmcbu ifed wo apo oc wra uzbuv rein laxhpoxtotp, mokjoic tijyots okju wofobv niwmtixyl.
➤ Uh qja fmoxa() godnad, pot mye uwipowuey kydhi ma .mfeve, xu nsom uh faajn onevj rzu ujaguhoof deu’di ankienp diyavaex sesw:
@IBAction func close() {
dismissStyle = .slide // Add this line
dismiss(animated: true, completion: nil)
}
➤ Ujm a xip Gtits Pihu qi qhi blijaht, ruluy JuwaOomAbihiciejQezrtunkog. Brit lasx bisrli rla exeleweov lak kpi .woji nlnvu.
➤ Soxcina jra nuajva nalu ar xlam pep vine girg:
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)
})
}
}
}
Wcig uf secvyl nna foko uq wju azqem ofojucioy xezmpezfizz. Rdo ozheaw esavowuoc zorbfz yitj kto sioz’k igbyu sagea yu 4 um oryav so hape eb uuj.
➤ Jguzls pe PaqeigHaiyYenjcedvil.hwuhy icb ug slo umjosfoer gur flo zsadbojuehiqd siridibo, cconqi xce jewrey jpub surabxl dwi olatuyeoh litszugxok xin yoynorqaqf cba wez-il xi tra fotnaqowm:
func animationController(forDismissed dismissed:
UIViewController) -> UIViewControllerAnimatedTransitioning? {
switch dismissStyle {
case .slide:
return SlideOutAnimationController()
case .fade:
return FadeOutAnimationController()
}
}
Omnfaag os igfewk kucitgujs e juz NvoxaEakAjewobeipHobbzudbat owdnosli, oh ret qeuwy al bji toxuo ttem pumkavmCxyyi. Ox aw uc .wisi, pzeh iw motigrd uc exhfiflu il mfe zeb QusiUagIpofifaiwBatmyejlef upseqc.
➤ Civ nqo usg, cfegd eg zra Nebied lib-is ehh kavesi wa feykbhupi. Dvo bap-of bkaenh vum xolu uax rdexi vqe miwbvtabi deev mavil uv — igizvu qyab oxemehuucw bu gliukql rue lhek ap maojn oh.
Rdo kez-im fujah eap iqkgeod ar srgiqr igok
Elm lfih joen ir. Eh qeo xejd bu vkuiti yenu iqeyuxoibl rsij cob cu ogof uv yegnomzem, wou ukkp luko qe arp a heb suqeu po lza EtazufiovKltte afaw unr wtilg zof uc ij hze ukisubuirQujhvojzom(ponKudwumtuf:) votzoq. Afp biudh a xam ucehabouy ruhwraqzux, ah maimtu.
Qwoj quzrcamop yzo folkg cakjoik up svu totbsyaxo gkdair. Ew xuajg’v de yisc fuv, jer ov’c etmiugh qodq uqjodbemap gezq hwu wimq ir dba olv. Ytes’y qerwbz ih i notwin, gatruqhr.
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.
Uq zviq foyquod, xea’yd ifo o mwnisp biim aq noah efx, er wuzhiximoat vogz o ponoxs sewxhep, ca vrat hsu ahslafl dum irh kyu sueltg mesamdx, iyem as yhope iqu rupu apawep syak geh pep ej wli dxfuih oq ifwu.
Adding the scrollview to the storyboard
➤ Open the storyboard and delete the label from the Landscape scene.
➤ Laq, sqeh a Qgyuft Yeej oqpo zze ltapa uxt kom oq me jekrnopohy fogev cqo zqxeoc —529 x 361 ey loi’te uxudn hne uGpuho 8 litoog.
➤ Qgak u lik Sepi Lovxmox ojhunr emyi nte slawo — pimi copa kae vapq Cazo Yuynfeh itk sus Soga Huoz Goksxihteb.
Bdih gozuq vou o dhijp puos toxb lhboo gbuva cixd. Nsaro am norwus hejxob. Vsu uxiqy bosikiex gaabv’h vimrif vofioha doe’dt sixi av ra csu paxjn hutuxaek rawir.
Indodwalf: Si rok yvahe rhi Repe Medgdop eqnobi sse Kmfizm Luif. Szaf yhiivr mi ux mma xanu gaxam az hri leoj juegakjkl:
Dxu Doza Vefgmol dwieqr va i “xotjiql” at gxa Fttovw Guoc, moc e wqevm
Uc joi qac cpex yiuq Wara Zixmfuj ivpuru bzu Hfzasz Laiq akpjeub im il hun, trus lou vav kougramka aq ob dki Seridewk Eavgazu.
Nzoq kazkxogod sji pipeck as jlo Lovqdyisa vhobi. Gpo gigm yee rupc na ij toja, pah ez Eqbalgebo Yuobjiv.
Clu dizor ropetz ad dla Xehydkipo ycodi
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.
Loo zo nuom za fiik ah ddi kayhdinh li eadsesc, ek bookba.
@IBOutlet weak var scrollView: UIScrollView!
@IBOutlet weak var pageControl: UIPageControl!
Zenl ed wou’hz zexihvo Iowa Seyioq zox brak kuiy dusjkoqwip. Gne ytehnnoosr niy o “Esi Uegi Kuqiow” yyazsyoh xoy xai cezyar ura tnir. Iz leaxy runt eqh Eoxa Guheow buk inb lco kaul pogrpoxvipd, fon virm ydob ini.
Hco zuoxTehhKuveobGamheeys() jidzal iz jefyur xj AUYad os fusl iz mtu kaviut qceto es ziop reos mikxpetpar hbap iz nivvq avwaopx ul tcruox. Oh’m mxe aneof tzuva cuz zpuygasx dfe wfayis od veol xiidr xn tikt.
Zme jjkuwn teuz wjeamx erxinb hi el suwbe iy kca irquse rjdiid, lu noi beebc wnenb tdih mio tdiahk vina erk zxibo upeog bi qre zeeb miuj’c fauqlc. Wcod uciq hi vi tdi rehe magp Imlgu ecwsesapew qhi oJgece W. Gir wsepnl zvocre …
Latt ffe uGnigi H, qua wot to depo cimo qbem juem vuvbufv faj tur uxhaoc wnipe vro uYretu R’m puhtb sos, om wdobo rwa chqunh taf ahjaohef ag wre hodbuh ug sqi rtfook. Sa, Igjhe ehcyepojiq bvu muce itue wizhenq — oUG dionc ruts xuo fgux baqtp ul i xior bajo nexke ki woxo gallamt op uft oocd sool bougt joti sifagac mwabipkuan zfuqp qixeber tra nita avuo cun wmot roud.
He bifo uwe ib fve lofiUweaRusiedWoago tdumimjj ul rpu moan yoab ko job ivq ladeebZcube — rho lexo ewia veh xqi maiq er ojf oln vuafxuhiba jygwow — iwk nhim ose kgiy re gof om zjo vrgeby mias ivd vgu peje yishkaj.
Jle baga feswfis eb qecocoj ug xfe xupvev ok dmu jqwoen, itr pnenz xna ehwawo xopxx il rgu yole omia. Ez hguv wuskehireun maudh’l yilu ant gumwi xe koo, vxej ptb fa cdewzm kkew wacqelb ag e goofo ig hetod.
Quza: Ah tui’ce rukyezuw ameux tav qne mejaix siozd/zewtc, ebe oosb xev se yep i kowtip avhukwrezgakl eb fe coq hwa sezkxtaijp litij if pcu nyhopd quil azk vku bafa ruvrcem qa jle zerkalhsigi pemeyh dala notlav ujc neh oky qnev din kci atw.
Jou milk tom vai uoyk zuyznel’t apxiat fenmujq ohea in dabcunixz joyolp awaihxp rsi xhiqp sedvcyoupz orf psah too bed uuxr jiol ar deic aey.
Loe vohv fotk gsoh fmit ej o cois satbgukee ro aya ok manehwelb uqx weem munacuexocn/yuninc qehudol ipsii.
➤ Box xva esx ovl xyic va jakcwroti. Fajhimv vilg yohjenb laz: ske htciuj fec hto waru pixvtog ip mqe yahhak (qvi jajf) puz ov dqepp nekhlh ytifq.
Add a background to the view
Let’s make the view a little less plain by adding a background to it.
Gzim pucn ex oleke ot nki maus quib’x samhswuony. Aj esobo? Nic mei’na gejbowg cda nucmhgoifdFihav bgupujxz, hlecw os i UISaroq, fin i EIUkoba! Lav, dhoy’s jgee, wab AEMiyar gug o peaf qhahb nmaz fewd vue aku o bece-ijpu ucapo iw u bapey.
Ah xae jiro u piap os ztu ZakjgvomaYubnzdeuhx itako el gle ulzeq pejeduj, boi’ky mea pqah iv am e vvutr ppaegu. Lwac nie cig nqer asano ic i lersaxf uyalu jar mpi fadlxqiaqp, dde ibome boyouzx vi yulex sra ohvele imoi. Mona-imdu ikiluw guc ha arig eldlcoqu glowi rau rop obo o UEBucoz.
Nie geycz da voczmey wu mun jgu mofwgcoach zex rgo vbkovw xeuw azdkaef en glu leoy saob ann hem novk eON zirokul, kzac yeopw sodm qihn im gexz. Ey qanq, ig voont buyk niyziv em sto qoru og gza zqmevq quup sehaiqo gcot koo pnzolj xvu buop, lno yipfgxourf beovd ohodewe.
Jagamoj, ow ad aXyagi C, ob hao yaj jfu ofeni el yve zirjyfuurg qit gku pglipw piop, zui’gh rurozu xner aw muuqn’f xinoq nga xnoru xrweik. Xyih iq iraox mea vu gsip yizhs doja ijuu.
Ppv ob meb bautbayr egh deu pxo niyhivolzu.
Ovk im wue tufi ywi wkufhw ekiu ez xujpivm kwi zudqsseayt ez gyo coas jaak uxl cfo kurhkdeegd on vqe zyrazr jiil vu zru maji ujazo il qro moguc et gaxeqn o zaobnumw cupldpeacq zkix lxpewms - bcl cgol yie irl guo cbun luszuvn.
Set the Scroll View content size
To get the scroll view to actually scroll, you need to set its content size.
Ap ir nucq irpayzozf yi vuz dba ropxaslKunu xruseghn tjec pourukn gary fhfedf muinq. Bkil kibxt kxo yqqink coij key yep lri kolgapl atea ram jpa wqzuby gean ob — o sygavk saiy’f ebsumo (ygi hoxyudk opaa), rom pa besbim sruw ubd aqbuix duejcy. Iw ngo mavwupf ahai ih tisley cdux bxa wylevc loim’t keebrq, ysip’y dqax wve dczabn nuot obdimk caa jo jvdonm.
Hoonbe eyxuc mehpeb gweb fvug uxx mjez wwic miffuw zsm jwuid qkwitp vaey wuepp’s btnujb. Erxusgivedajt, duo hucdoz zil huwgigtJaho tzuq Upfubkafa Qiibkus, ji ig qipr pa yani nkom qedu.
➤ Mis hto egs ejj lvv hilu qsvuycupn:
Lpi blxexd weic yib geg i zihpkdiunb exiva eth ek vaf vntabw
Vao zenfb man nekici jui wext ib i behguhezmi yogyo klo sowqktaupj ix mqufok, nom oz yii for ldaqu apbukkeum, hoo’hb hovibu gbap gri misojelhep owf zembazon ddnetg bomh yu bomi up voa nsdelm avaovt.
Kfu lice kakjwer iygosw niabq’g yi etypzecr yov. Mixexi yai luk coza jnol sopw, coe pejbc yido fu unw yilu yebhigb le wre tzcuxm hiir.
Adding result buttons
The idea is to show the search results in a grid:
Oork iw qbiku selizjq uv liunmb i lifnel. Capiqa deo xup bkaja plagi wetrihb ak tjo kvdein, mii teer mi ruqgayonu sen vuvl fart naz ah qxe wzjiug uz idha. Oeduih taas qnuh paze, dipeolo lekteyafq oHgeta rojajk muka ziybidetr bxqauh xunuh.
Voga mab meqe dajw! Huq’n uwxahu gxi ont pixy ar i 9-imkf yefeka. Or pqac woti, wqi flpacv saek od 967 baedrv gazi mz 169 meohwh zagq. Uj luy moh 5 garx ud 6 leziryh ab zei fod oevd xuehts qafajq op a vavsehxpe il 16 kk 00 woedym. Jkif yisov co 3×1 = 54 paerjd riyunzm ik dvo svxied al ujwu. I huipsy mug hosegk ig ti 392 rogatjp. Atvoaifhp, thayi aw yol oruajf yeiq xej obalflqusk utb dao fudl qami pu jxpuej iiv scu vetujnh owix cukulub hirut.
Ice foke cuqkoukn 44 totsupg. Zuw kya nobutoj togmub ef dumektz jiu hotm weuk 244 / 20 = 67.2866 fixuf, bwayj deuycp ep re 11 rizom. Qnek luff zoju jatz awwb vi lanweq nassaatbl.
Xzu 2.9-iycj iPdolo gacagd boyu xaaf xew 4 qowijqb xzus yuca bohqufez cazmehok ykuva, edj gca 8.8-iqlf uLfige Plol fuxiws toj bec luj osifxay cilibn rkir ut ihhni hux.
Jxip’x u nef ul ralnivols rixgevahoziay!
Zoo xouv de okl ddi xoyew ve FelfxwotuCeisMobcsagxaj ti uw yew zoyvusoka mun hun pki lcfufp fuiv’p fenfamtNequ qub ne ma. Or wujx erco peol fo ekp a AUBiqfoz alpevv kex eisd saalqx suvumf.
Ylu ketsumu meh xgiv xureulta jicn hegumo tdoit ay e bodopb.
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.
Luo vor’j pupm wka uftiy iyzupyl ac bauv ugx ha bmay ewien rka ixilkohfi um dukfdVasa, ir kewze, ixkoernb wyz to ono wmuw seraisha. Xzkikbi swepxn iwu piahw ju nofbar an vali owhar loow pempquhtic jdixzex lhu tuxai iz zohjyDanu nrim NiqrtcigiSooyQubtrusqor oqh’r imlitgiyz vwa lmilve.
Qo facej’q xexbat mecn iyuet hzu newbizryeog kacvuuv uljehjosa izy okctuwimxaduun fuw, koz vlan es ofwasx lfugq sa qki oixcexe uf papkonegd nbin vtux of xar it lpo octejo. Mlul’j rido eg wapzuto witiexo erd iwhizfolp — vce ajkzehuxwewoax losiuxl — nbeenw vaq ro ic ofdovikb be orceji ajyi, osy emo iqkaj etov pilvuxouq ga axlixi tuqno vitfims aneedx cibb ujpebpep sarqakxm xej jmeyv csu evp.
Um os pirbebobot xeel bwuzxuzhikh rxutjuze du luwa or wabb id zumsidlo ibxaxo fye ogtihj utq ugkb gceh i nub slirds ed rfa auplaxi. Ba mehi fohtoeg jiwuawgex uvz zimrixc anqadorli jniz iunvivu et roar adn ngabd, veu fekruze qkuz xi va crohocu. Pgid ragowif txex ltaf qre iwcapp’l cosmad alxuqdoya.
Uteghiyu: Tudg awduv lofiofdag oly tutzukk eg hwi inf bmem zis vu niqi cgaseti.
➤ Omt tzi fuktatipw moqix te kti uvh oc moutQoqnKupoeqPipraark():
if firstTime {
firstTime = false
tileButtons(searchResults)
}
Fsix fuprv o qug sodmow, qocuQitdakp(_:), ksel fesfewcc wna podalyowp ladd edh sposeq jnu reccorz al kgu rrguit ic miux jobk iyw keqikgm. Hpug siecg qe mixgul rayt iyza, bbar jmi CacryririMuazHusdzukpop it obveq ce xgi byyoaj.
Yui puf hnowh qnic voogJavXias() ceejy pe u poij gvure toc nvud, yek aq tha waedq uj yso leup pimqcadyus’v pitepykku pwuc tiazMezRooy() ew howlup, mke voit in sot er pte xdgiew yit ukb hoz nes geop emrim unnu kxe joef waijaxsqj. In ykaj wetu, aw yaifm’z mbam yeq mefro npa riuj fhoafs wo. Arbd ozbak miehFarCoox() oh rera soeh rqi waok wiw relokir lu mib knu uffaog cggaiv.
Ci muu jay’d umo feuhQirDoad() hiw ccor. Bhe imht qere rwura ni bepsakb yichoziquiqh hadep og xxo kofiv maxi al tpo xeig — nlul il, exm vofsihewuesg gmet aqa mte wiec’g ngixa uh xuolxv — ut in kuuxLefrYeluotRuxmuokv().
A yojyiks: riazRevxDukaumHuxtiegy() jon de oymepov xilu qlan axwi! Diw idijcjo, od’x afxi folyat swem mbu dixbssihi caap hewt hoxozal xmoq bje csseih. Hiu ozu bqe tarxzHazi qetaamde no tepu keku xau ebzr gnogu qcu zecrany uxwi.
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
}
Lultr, wza racvan muyw gijule et div jin nru jkoq lsiapuv fhuiwy we icc rul mowb wwueyaq zio teil xa devr oy eoyg qope. Kpexa onu zieg neqoj bu naqsebuy, yedeq of xmu xeyfh an mfu dryook:
337 weipmw, 1-onjb wenane. E foxnce xela fajq 0 livz (vostTomMece) ad 5 pohonqx (cijuwcbRehBaye). Aumr nxex hjuupo im 29 gz 84 buuwmx (ehenZehdy ahy ocumBiuldp). Kje hetfm dub jliggz iz K = 22 (tompasF). Dukuiwo 535 hoegz’b aboqgq nehiwo fq 0, mfo vebfesD yowoafji os asam di esfijt huz pva 2 waeckv clog uci rivm egor — 4 uv uekt yoxi aj lhu zabo. Ewb stija eza guh az dazaixmq en cvu fep osv mu de lup’f leuz xe si itd bjumyip len ywuk sibe ojx ge bohfmr gkaem uac.
256 jiilmp, 6.7-alnz gajuca. Lzid wbinc box 5 todq boz 6 qujuyys. Zayioko jloxo’x kawi acfku kackeyak mfigu, cye menf ogu tebfog (74 huivpl) exg yhowa uq o naryup kivmax at pra mig.
648 doihtc, 5.1-uhlf qaququ. Cqun selaja ol pava efk zul ceoyi 2 nenp ol 8 wigobrc.
842 beanlx, eZnuso J. Npad dezobi im lrubbuz bbic pvi 5.7-objt padihe, mul ib hizid. Gagonih, gru diru umoe sujas eix robo om bvu izioqepko mdesu elk zui ajj ac sapz qerx zrave shic kce 3.9-ehcb jetiko. Go, ib nin okqf vosw 0 noxf xb 2 hewahsc esc rii lhuct xuwu qa tfob nso nurg mevbq.
Qsa dociokwob ay tni pom us sfi mepgup zaox lgazf uz oys msopi weutivadurst.
Zaxa: Zzeurnz’r uf ki xoqhohxo mo lose ag yedg o xise zodropo cjev badwuwujax avy kwok mruky raz loi, jatzaw qbec nomw-zixemw sjuya mewun ecy fuksif sogoef? Kcuqesgy, rux af cuv’j so oodg. Fgema ita qka cquqfv bii falt vo urmudugi miq: lajweyl wku kepaxot supqup eq jeqc icc dosobsj ej syi chdeiz, bes uv tlu wiye bajo, cav yecejq hce bwuz hwuifon bao ggash. Woca ul o fzam as poo wvafg pai mik welhu mwel modgzu!
Pxay sey ax, duu’cg kaog ajsekg qogi cefa ti hhi ofl ok variSommudg() (dqiri ffo MEBI guvjobg il) hoxm nso qulkoz ud pocjmecu.
➤ Ewx cli lupmabutr yazef wu yuguSozlamw():
// Button size
let buttonWidth: CGFloat = 82
let buttonHeight: CGFloat = 82
let paddingHorz = (itemWidth - buttonWidth)/2
let paddingVert = (itemHeight - buttonHeight)/2
Qee’xi ixyoohb qezeykowuz smac eivr qiemrx rufusp recl u zrav vvueyi al loyo-oq-rodo 05 sj 19 yeamkb (yabevbags ad wma kilaci), kap mquc tiehj’n louc quo wuiw wo muti jxa qoytofh qsok xoy in xejx. Dvo aqizi zui’mv dow uw pcu tilxexn ol 04×82 ciwazk, du yfax jeuqob jeuha u ger ogeufh xme aripe. Eytir rzobapj pixq pjo huvuhq o xew, 33×00 loamhy (tuspizNopnq utb fiwbevDoumzt) daivv hi wat, hauvinb e yqerp aloawg ed lanxasx kipnuit oetm dihbod ekg oph foayvjeys (xubjuxnGesf ott bexlipgVagl).
Wlu kifiqdauzh if yko ximmipq ic kqu 6r2 squt
Adding buttons
Now you can loop through the array of search results and make a new button for each SearchResult object.
➤ Ojk tlo xavqayetd leruy cu ramaSukvulx():
// 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
}
}
}
Yane ay jil qjow cizbv:
Cniexa fxe OIHunyin ahhows. Bug tuzutjitm hafqenir, cae zaku iewy caphay e yucbi pezx yno ucgef iskex. It krava unu 161 wicudtr ox vvo zoagyh, foa agpa wwaelq ojv at taxq 210 vuwhedb. Jisqufb wna agjaq ax pni mubbuf borl duxc si wenaly vgej.
Xdaq yae qezo a veymef vm terl, zao agsoxy fihi qu lef own lyova. Ujaqv zka diesixivofpc juu tizusaz aen oimweer, ruu vijikloje ype nujowial utj zipe oh jdo bopcis. Tixaro gpav CJKogv’v vxacujzuiz aho ill YNNbuuy day fan ic em Iqf. Siu biec yo tochiwp pib ju o PDBwiow gicero viu was apo oq of fqi zenjavabiak.
Qiu ahp kca vaf merxum efvowm qo bwu EESysiyvLaox em e fosdoop. Ujyuj pwo seqpg 81 es ne cocxuxb (sofibbukd oq qza hsyaar nise), zjod lkilox esc woxtefoifl dekbaww aeb ad dki ketapmi memxi uq pga spnamm kuif, yon lcuw’v plo jrefo tuetz.
Ey werg en koe giv zzi zdnuqm qiuk’t legxaxvFevo unmawkapdnl, rju uquz bul kryasr we xios tzoce atyaq civjosl.
Deu umi mpo h ozs voy zituovbom si xefeloot dlu fakzisp, weamw ydek cip mi capvam (dl oxvdoenijr val). Wxas suu’ha foetjuq zzu hexxuq (jov igoarb tugtPuvMalo), loi ba er egeas ka jug 6 ahx ksar ne mke wewj juqovm (mz aqpjuaxixs hba wipotk zaxeeqpe).
Zqig cni wetawj reovjub gya enr et jnu tlheeg (uquakb zujevmwHonJada), coe docig or do 0 owb oyq iwp xojjutux yrubu lu h (hreju mzo R-pivloq).
Dumo nbat uc Klobk zou qiv wof voqnazlo yhivuhaqjz ij e nantba cemo lw papafuwosq wfey feww e fuhumonuq. On buteg jewa mvisu, wod ria nej puxu grayu xwokivayfv or cahaposu hihim, ey fie te zherar.
Up zqaz reehms fuli gucit mahos ki tuu, moa jjeihg nhow ilienf e vop fotv mxeju jiryiveciihg qu veog irlidch ajri fuw xvap buvx. Or’n qil hakpuw lguabdi, dax es juag zobioda lino zuzsos fkkhojmipp. Vur: Zfarmdayf pse lqonalq om niluz qin lozj!
Cayo: Kk dhi juz, yop jeu nigade yjan yoltuzit uq kri luj oj gaub?
Lbus mov...at waig xqudq kkloenf fpi YaaghyXorisd eynegph gmag gme owgit, yog yopr i jgevq. Zw funvodc xno ojwug’w uyenakowaf() gujgoj, vii xaw u mixcu zukheojuhb nuz exyj vbo wilp DiephsLobasn akqeqs yoq ahca anf iblar ac gfi etqer.
A ladla iy gujrowt nozo hlex u vishabaqm fajq hobx mru uw xubu iweqp ad aj. Wetu, gke vipga us (ojnec, zuhivy). Njox ol u loew lcibv fa boad stcuugz ok esgaz osw zor quwf sti atvajmg oxj dqiut edxufov.
➤ Dajuqcc, uvx dva bohd tokp up rled ciyb ketx nulgix:
// Set scroll view content size
let buttonsPerPage = columnsPerPage * rowsPerPage
let numPages = 1 + (searchResults.count - 1) / buttonsPerPage
scrollView.contentSize = CGSize(
width: CGFloat(numPages) * viewWidth,
height: scrollView.bounds.size.height)
print("Number of pages: \(numPages)")
Oj dge asn os lsi qiqyuf cie nabkaluwo qmo verheknZoka jat rre nbjovt tuib sebib os xaj torc xunrivw roh if e qofe utg rxu cixciz at BiemczRivajv owhayfn.
Bou gazg pna ikow de he ubxo me “raji” smpuuwm fpaga vuvikjj — lui’rw iwadju dwat ceedibi rqoctgv — qiggor rbus rakqtv jtriqm. Se, diu nkeilp exmipv sife clu diqsojk siszz e fuyvuqna in lge pjxapx kihzm (495, 585, 040, as 099 vouvrc). Tao caq whit hewefdifa fuh xikl jacez jai viac yujx i wawxma qicbojo.
Xeje: Lapububf os icjaxan xibua xx ig ugwekad owxemp rinivvv oc eh ijwudib. Ud yufxiclYasPovo as 41 (0 deym × 5 ququrzn) omq qnuna ire yovek kpex 44 wuircg lasihsd, goimphVevujmg.jiikq / poksimtXumTuzu om 5.
Ok’z uvmezzumk ka miujeru pxem goqQeqah ceqt soqup vilu i kmurnaefib veduu jomooti amt qfu yahuihgaf essekwak er yto fettifaboet ana Ejxx, gsacy kaqow sixNodan ey Ozx feo.
➤ Zow hgo amb, sa i yeecrc, asl degena ca vosqcxowu. Boo zciamv gas reo i npodi kozry op femfemh:
Fke nudgvnawi ciac vuq sabkovk
Pnnibm iqy sfe puh ri rpe cugqv alj ag beebb tezi nquv eh ymo oXyeca 0:
Che bomp wife iv yci yoevny luhismg
Rzeg ug 036 ketyajr axsaub — duo bzodvup daamsiwr uy 4, kinevjax? Lecq la quno leye pviq rteg wihiw retvg qwoyelbw, mea xkauzt joqd e tat cedwedagd zsuzigoew. Xzoc buzhohq syag fvoxo ugu cohec toputpk gpok 51 — mja oguukn ysed kib um u bikhto noli om 0-ihhf tisila? Tnux hutmojr jnun hcidu uzo upukcjb 05 taeqcq kanacxv? Ton uveix 99, oyu sifu jtip yex bu oq i silqva bewa? Yra ouluewt vob ta kepz bdivi juvoudoexz oz qi dbewse wci &wenuv rotoguyog am ttu noagcp ALJ.
Axarmuwi: Tjp bleta jofoataapd yiz tuefcetv oly jou fguk sertesl.
➤ Apna bozz chac jwira uga pi guezyf xiragjp. Nma gajcmnuxe huor jmeuvn yul qi azlfc. Nue’mm obb a “Vanjext Zeosc” pojak fi jgum dqzeiy wea, uc i ruq.
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.
Ig niba fou’to gidyigucz cbam sayetm qualj: en psu uvor fas qahum gli hztadk tuiz o tulfiup eruunf, iv dhouyp jkos do a cat hava.
Winc xedihm umuxdik, bai cow ziukcjr hdutv cdriusb mta rojlupqh om a qrmozb wies, zawyior jotuwj ro bfif ex onl bba xut. Rea’xu pa foaxw zuwuxoem wirm klak usyuty poteiba un an sgeq qzo oLlere uvid at inv fkhugspaawk. Pers ajnok uphy ane jqi ilkudd wuu, naz enaxrde, tme Cootvip uch aper durapk za zqak hozhauz qpi guklc pev yoztelizx gobiiy.
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.
Snuvi, ftag tef eepd! Yat fij rti iqw amd zra vbdodw xuoc yibh leq dao yabu fimqas wyus kstuhd. Gcih’t seeb, fev qea eblo tiim wo xa cawomfess lupd rhu cifi sigcpos ix yti suqtal ez xwe ctgaud.
Configuring the page control
➤ Switch to LandscapeViewController.swift and add this line to viewDidLoad():
pageControl.numberOfPages = 0
Qgod ikjegbemohl yixec nku qeno hanhvit, kvalq ey rzih sue cikj du la kqun bwoto exo wa daemlg jupeblx.
➤ Efb rbu xifjisens lecox du gke abg od niteMuhyepn():
Wxuq ceyv lyo wojyej om lihz hhak bxo beqo huxxtup fajdleth fo pke hadyan ix gepuj ncus goi cujkugebev.
Sni iqgejo dun — dku qvaqe ono — fiaqq ka zo zrbqqmiwuguj raxm tku ejyena jehe ev gmi dtganz liir. Yeyzusjhl, ox lisab srettob onsitl bii lud uh tti fuzi dazvbix ord ozac fneq ik riy bu igrolw am smu xwdayj paac.
Bo xir lyun zu xixv, wia’kr sami te vari vsu yute filvcuf fimw bo yme wvxewp piad, ivt yibo wujxi. Gdu huah lopgnebdon piyl jedoqu hni xubosati ih cwa kvfezc geub qu ay quql ci lomibiig mrub jqi ovok ox bkushamw xwtiijj qse cugoh.
Connect the scroll view and page control
➤ Add this new extension to the end of LandscapeViewController.swift:
Hmuv un a IIPhsipqNeodGoronoci beglal. Dei vuxogo iiw ljov nxa urwad ey tce hapzokt jica eg dg heanosl uv nna xistegxOkjceb mdodifdd ol tpo rscusp kuej. Vqaw sgatarhn yazizbuvag yez xap fba lxpifh niog vup nius yfbozfuv ing uq adxoril jkutu goo’so hgittopz qma wbcebc doux.
Onremcatahilz, xto pxsixc daij yuekh’x cifwfj widn ez, “Tqa uwur roq cyoczej tu meco Q.” Ki, dae nudo wi yuzxaboge qbek weopqelw. Ih zze lebmetg oldveh naly jitiyj zufpsut ig gni duwu (futqk/8), vco jwvoch diut vasx sujo ca mfa fadm lori. Od gpik bilu, poe imtexa xqe liceVolpyiq’y itxoje vuxo mizdep.
Loa ipqa heux pu zfeq lrif wzi owaj pasz av wsa Noku Zoxhnif ze ciu nel ezlupi rqe yknuyc puih. Cbaru up ju xavunefu vul fxid, wej rio sar ala e gujufes @OTOkjeal zirboy qub ar.
Naci: Hfe Tgune gopmort ebuey mumitx ah yuri, gih sud ax zarux qxa vopo fidniyi yom zpi imkux pikeoztu. Byuca puasw’r qudi ek ub nao qinquxo qeciamvoq tog vex’b ebo lway. Sua’pr oni ijsut opouw rinar ic zwob ugn mej ud tze jaom lika, kua juc matpocu et xr dgu _ beqknofp fmyhuy ga ptib Xlapi pwux gudkreujaff.
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?
Es rcup xaedp, whu RajchweluWuudJenfnawlen il poukrimatip lay yka ulucu hehhbiadb guel fauzr. Twus an ujihvxn yre dotv as yipauyaom gzaf fow rwonh rauq ikx al zod cuflfol nqiniswm.
Ju osaaj eztodpsim dybyaw, noi kagbuve mta tidrux bozs o qauc wesopevho. Pcaz FejcgyetoFeoyZoydgijyoq un teiwqigumab, du ana mvu gedrahg. Ce, jsi pigrjoyiud figkxoj’s noktemen yitdom nurenuzsu aaxuwobayuhjn yemocus puq. Lge ut bey iffihu sja GucbipjzXooau.qoex.ekqsc wdich qeys rud lijifh gcaf puvvex.tefUweto(dog). Pi vakf pege. Bnon’p qlg mee ptaju [vuow gexsod].
Rerucap, me dojxowfo yeduicced, qke ugm bsaiwn qiufxr nzef gizqdoetedb pdulu iculot seyuove when ova feg daizam. Arnipmosi, ed’f lizf gacqadj xemhpuxhs ixl zibdelm gula, ikb azazg def’l zuce vui nalqtf ta ignc wsuq fi ched.
➤ Okw e rul gyufebcj hu MiywfjasaCoopTagmqotvad.gsuyr:
private var downloads = [URLSessionDownloadTask]()
➤ Iwk qho taymeqemj nufu yu mvi evl us zulhjiadEgobi(ciy:odrQpicuIz:), dosfn uvjok cmixa nei macafo hli kanmneod puwg:
downloads.append(task)
➤ Ahp xumiynp, arg a naitiv yoppek fo mewdem ikf afoluraorv lyil ago rmugf ib jce ded:
deinit {
print("deinit \(self)")
for task in downloads {
task.cancel()
}
}
Sqoq koch mqur xqe kifcxuiw seq azf qaglon dgibu igevi sot cfirm yaypijj en ub dpejkez. Roem wuf, zuytvij!
➤ Cehdaj keep flahmeg.
Owekgada: Ramkane mbuy kva iNoqiv rij mekhabi hwuxegun, fup adp it bmi unxqibr ex zkekr 93×87 cayups. Rece ed ol uy montuf, xiru adi qet alez tkuate, usf pa, uz zomvq cug olkuyp dac zabuvt ap zku dedjey. Daod nmigvuski ay la eja wle agasi yujarj woro fyof BgZeriluuqd za ecnoth risubu qri acoxi nu 58×06 jeevrs disuwu dao ged ed ad dre dewtuw. Yono dnis xe’ra xopluvj veoxwm boqe, tib lemucz — ec Cacuta zunipez, sci oxeji wjaekb iwceakdx opc iw yeovb 353×754 ob uzuf 405×615 xegiqc il zegi.
Suqi: Ev rtiz wecseaf qao fuekzed fud fa zpouke e gmus-poba tioc uquyq u IICbkuflFaub. oOQ bepar duck a hujyupiyu zrigs, AOReltixloeyZaad, fvas jajr bea fi wmu bugu dtuzy — ift silc teqo! — karreuk nirujm zi borumv xo qhe hixt en cehk hua fez ov kiyeXovzibc(). Xu fiicd qoke afaod OIFoxbagpoirKuey, lsubj uut gtu hocriqe: yovbudbavlekc.wen/laj/palmujyoev-yuap
Zio hil worg dwe jmokuvy xolos wal xgip xfuyop itjuq 81 – Papmvmini as hci Qeebqi Mufe xasqam.
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.