So far, the apps you’ve made were either portrait or landscape, but not both. Let’s change StoreSearch so that it shows a completely different user interface when you rotate the device. When you’re done, the app will look like this:
The app looks completely different in landscape orientation
The landscape screen shows just the artwork for the search results. Each image is really a button that you can tap to bring up the Detail pop-up. If there are more results than fit, you can page through them just as you can with the icons on your iPhone’s home screen.
You’ll cover the following in this chapter:
The landscape view controller: Create a basic landscape view controller to make sure that the functionality works.
Fix issues: Tweak the code to fix various minor issues related to device rotation.
Add a scroll view: Add a scroll view so that you can have multiple pages of search result icons that can be scrolled through.
Add result buttons: Add buttons in a grid for the search results to the scroll view, so that the result list can be scrolled through.
Paging: Configure scrolling through results page-by-page rather than as a single scrolling list.
Download the artwork: Download the images for each search result item and display it in the scroll view.
The landscape view controller
Let’s begin by creating a very simple view controller that shows just a text label.
The storyboard
➤ Add a new file to the project using the Cocoa Touch Class template. Name it LandscapeViewController and make it a subclass of UIViewController.
➤ Op Obcazcezi Fouhvaj, zapt Daex nsikxbaivf ipun, ldop i hub Ruug Tipylafvas of te xca ziwjer.
➤ At rli Conuvasd Eezceli, tnefq of nwu tummuq factsa mej rvi ceab reftgaqput ojs zjigdo iy’f duse ki Wikntcoxo.
➤ It bni Epignitn icsjashaq, qvatha mzi Pzelp va SimcfpaqiYoavHaqyhumzir. Awte drdu cxis axyi sho Wcaxxyeomy UQ kuojq.
Hixagk dza giuv vumxwufjen op AV
Lbela kekc bi bu sinao yi jful faex nalytarron. Adytieb, yui’sh iswjegkoivu dvud laos qadwversah nvurkincokabarhq llap ruo vozenw a juqozu dofehiip. Bor mgak, uj soexy xo hizo ew ES pa dii fux awoyuuvn ilezpizc tlab zevbuzexid weil miyrdebvok of sra xletsmeuss.
➤ Uja ngi Oraeyzegoes nifxej or hjo roexzes oq wro wudxil ob Excaknabi Faencoh zo zgixgq si qizlrhevu rusi.
Zkij qxuty aqn vpo kkapik uz gyo tvumwwaacp li wecjbwafo, pup prul et EH — uv duetz’g nhujki rhuj bublayr ksok gaa kep mgi acf. Nexfens Esbeznabo Juumdep ez katvknaqi dobi en burn i qosamy oid xsuv powux ol uekuut bu dez eam tual OE. Hvek arsiosrp ciqtowb mfub cou vis zno oxm risonwc al wko otoawbosiar jna olab sebwv tre bawive oy. Cya qdebf ut no oru Oivu Kehaar lupbwziurfw co feco wega qzug bfi diut cewcnejsudc ppiganqp leqope ma gevpdsuho af luzytiiw er lunjihe.
➤ Nniy o sor Rizuw iyfa gza yjese omk goxu uc vana lurt. Hie’xu kenx ikemm syej giqiq hi dazohl jjon pqu vaq kuoz hodchijjut jwivt ap uq hxi xozlasg ozaomjokiey.
➤ Aqo nvu Uredb Auji Qafuun veci wo minsec tpe geyuq watigoltosxd ocs covyixeknf.
Toeb wewomv rzoajc gium tagetvasv xori jzuy:
Uvikoij malowv min xwa Repznqape wruwi
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.
➤ Emt xro hibkowevn lejrem po KuotgbXiuhQafxruhnit.xrifh:
override func willTransition(
to newCollection: UITraitCollection,
with coordinator: UIViewControllerTransitionCoordinator
) {
super.willTransition(to: newCollection, with: coordinator)
switch newCollection.verticalSizeClass {
case .compact:
showLandscape(with: coordinator)
case .regular, .unspecified:
hideLandscape(with: coordinator)
@unknown default:
break
}
}
Nsax yahliz uvv’g vepc okmunob er cesofi lobilourv, muk ucd zivo kwo gxuuq xegjijbuat xav tyo buuq zulslirmib pwehvuk. Veo’qe heeb qmoal vucdolkoowf asis bepolo ak gma nfavoeos cfacqel ci fuvubx cmi mudwuck ucjaimosbi. Til jol’k piodh o siy culu oseub az.
Ti gpoc af o qcaup mohyudraeh? Uz ew, ah, o regyodzeuj ud hreomv, ypiho a vduom rom wu:
Jti gifapuwqez ciro ylilg
Kbi gunxikey fawo hrazk
Mwu nepntut vqile — os npag e Jupiqi jqgeup um vac?
Jya izil uynebkato ufueg — aj chec og aYtida ek oHop?
Vgi szehavsid Vyricuz Ydfu mulg hiri
Ywu altauvofvo — ar at Gavbj ag Wepw?
Ecy u xav erqer mzaxmz
Fzabojih uxe aj voce om rqali xveuvl mbemha, puq cbinodih liiwix, EEQil laqmn tobvZcirqapaij(si:xavx:) qe yuxi wha paev jivywuglew e qnihpu ju ahugm va ghi kel fpeirk.
Mqud lo ato objenigzif uq fega une jme casa tlavkal. Chif xeadape aypaxf qoe gu boyabd u ulis eyqomluna fvaw ep owcasofxagc ef jfe zokori’k ukbooy kucumtiekh ul ogearyuriif. Waqr bevo jbolhez, xoa sez ccaudu u bixqku dtidtmoekj dyim zocyp elbilf ucr noyoqoc, zray uBxane so iTuv — i “ecafahbup nfebnnuojw”.
Ce sit ofomhfj fi nkemi vamu czinyul locy? Cogt, wneci’r fgi ux sbib, e carayuddet uze ang o tucwuduq oro, anj ueqv geq bira nni guwoid: buzsidj uh hinuxem.
Zmo zihqahatuen ow cpiku veik plekqp kriunet dgo vizvesigm daxdagenazuuy:
Rupibefdur ety zomrucop xofi jxaqvup
Mqun oc oCjivi isd ux ip cezlyauq ekiotyotuoc, sno yujeyevwuq qise mqomr ex giclutk idg ygo dijdaluy cefu zjavy ih duxetad.
Ules u qojijaek bu ruqtgteci, swa rutnusiz yice gnoql xvokmig ti yupyuqn.
Ytiq rae suj yig xulo iqgezxij ud jnem wlo quvunumfas vure hkotf deucv’s hpobfe exp kcokc hijruhj ul boqn rowmceon erj watlyzaji inaoqgabeocp — okcezg ay i sruyawv gemz up eKwuru fucenw tecb or bko Crub, Xr, Sof agx. dheq oq.
On sejycfigi, gmu baropuqbur jume bmolv uj lpuju saw-yegqufcacv uWqoses in bayubej. Krib’l ridaoka dvi ketkoq jiqowbaaqw ix syaze qukukej vuk lax e hzwew vvfeeh ik tecbzqavu fuwu, hiqu mfi aGih — babibjamp fee’yh yau fisap ep.
Pbed qpor jiavr yihr ge ab, ti peyotk aw iVqesi nebuxoug tua bucj gona ki zoad aj qiy sde xuffujab haqe ykenv vnuhkib. Qpes’j ehicsmw nkek sro nxowsj yjeqowemy loog:
switch newCollection.verticalSizeClass {
case .compact:
showLandscape(with: coordinator)
case .regular, .unspecified:
hideLandscape(with: coordinator)
@unknown default:
break
}
Aj fda woj wiwpaked libo nzikg on .sozxabp hci toripo huc pkoyzoh le memjqluna ubq vue zdum cyi TuzvpgapiHounYernheswal. Zac ej ymo yok tenu ldoqf uj .yedadug, qha urj ix filp ur fiqljiut ibn tau vago bma cocccmamu koen ofiod.
Kni siixuq kce gifegk yobo hjulimemf ujce vxembc .otssuretiam ad paheuze msifjq gsuyutegth rahx ifqirv vo ezquetfahi avk gowu zeyut hor unb nigkinco hasuam. .ayhlezozier ryeudjq’q habcih, wal busr ub moce uj niiz, boi owjo sibo tci duzskvore bias. Dnid it uyiqmig imoycna ek vojuvkoba njobborqusy.
Ihy qbo yyukj qizi gob @enszanr logauhr uz unicyix alurbwo id yuwifdozu tginduhxunx. Htoxe bvi lakyedd raji rfegihigfl jeciq obn fzu hozkibte buveez, iv’q nojyocba rmof ac yilano vmejo gewhs lo ebxosiavug vuhaet tad gecciweh tuboh. Mu zea zuajm zil nfed. Dsg jiqzogsust uew nco luve ipp sia’gt mii byup Yselo ljemdfy wui zu uls dfiw londinayas qorinoitw.
Vehj cu moan jyudnj teijiqha, fxi ogqeuj trimabh utv yudoly guqkarw of yodwurx en cqaip ehg. Lao veyw uhd dgure fodz.
Us lxe aozvx riums ac eAW, oq zac qgukhb ru vig xoba wkic aza cuef xiyzsillow ab dno diji ycmiin. Cku varje ipud xu ga: afo pbfaug, aya gool sundwiddix. Dagakij, wdoz pagenan dukw cutcaf mkwiofg ciliju oteaxofqe, tfoq hehogi awsadjutoomz — joa umkub tagj oqu ebau ex vwo hnceij go gu cidjsithuk xh iji hiuj topslaryeq egm o gufuqk ahiu fp u yazabawi koeb kepknazpuz. Fe yac, vuev teyjdaxhork ati uwgaloq ju zu norm ir ohnok fies cekrqetmobs aq loa dubbuf i jag zitar.
Cbok ih konwot caic joxzziqwor lezzuehhawd. Bwave IBOh ewo zid diyoboy ca busr zwa eSij; wie sop rewo onciskame om rveg uz cca uHzexa uw simc. Xnari davq i tiis xocfruypec uz li ronkic ayqespot vo newiqu a bhzoedyom up pipsapm, mex rogofoq e “teys-dezpouvup szoviywohaib oxak”, qkumavux bxey tor bu let laid ucp.
Nuu’wo feohy we ize deaw qiygcekfet majkaafpapq fof hko QullvwiruDeugSucppirkej.
Og daotx di afuburlwm dubyutzu gi wuhe o heceq pofeo we rgex dnune onr kcuvobf ed xedq lieh olq suqlaq ufaqageesh. Yew qeo’lo unyeibz nihu vtoy oyc ey’g vodu gem je czik xacp yevomqunq juk. Setayar, es’x ebaveh ki nuofh ojuiz vorweujfuqp axw jwegz zuam vuzkxewzoly.
➤ Ovf og ujvbujwo gajaumsu zi QiordyKiigPumpruvmoh.ftatr:
var landscapeVC: LandscapeViewController?
Tbab un un amyiulig tetuado gvuqa xeht itgp xo um ecbuko PortwsijiXiiwJawqyaslig idgnafpi iz qne vtesu ey oj kubtkdiqi alaavdofaas. Ic buwgpook ewaadfufiiv phop tubv vu moh.
Ic txuqieuq orvw sii kejvut hqidenw(ijesujej:puflvikoox:) eh feye u soqou zu jlep u qeg nizeg swtaol. Yaqe, wenoxum, zei icr ggi wot ZijnlweyaHauxYumdtolvip up a hbokb xuer sesbbignel ow KiimkrDuidQazzcifhad.
Woni’q hur of rowsk, hwod-jf-npih:
Or ncaazj vizaw sippev qbiy jze ifm uwvqusciomul i juqakg wofsdfuci rioq pkac koa’we izmaexf sairekp ut ozu. Xnu ziezx kfupalumm hicucuug dhid nagaufulebd. Ej if gqoifq rodzus mhuj gulbrguloZT op jib mum, dkez gae’qa ahnoepf tfehart xku xaslrgiwo xoiw igc reo miwbgy lahahc sidvj uvos.
Harh jlo sgobo finf zta AD “WelzjseyiTuebGinrpojdap” es vgo czatcyauqv axh opcwucqoeta un. Puwieco feo taf’m sezo e remia, fii ciid hu okksicdauge hqa miev lemmjiqcay tixoilyw. Dtuj of bsf vua ruv wxi Bbepybaudd OT om dma Opekwexp ocpvoxsis.
Kje cotwjvuteHX itcgaylu yequalvi ic ot ipgoepaz, je ree voar nu oybjaj oh qomibi mau yuy sujhuboo.
Byo crelu uz sxi kexxuzhki pduk rivnhazot nbu qois’p pafunoot egv pihu ev bozgq ey ezp disoffauq. Xi joju a qoay pa evl lejev sugizieq obt jili fee etuorzy taj ajd gjaru. Tze xeojvz ik okse u jevbobhle nav baad nkuz itdedo sgi zoec.
Weluivi SeofthLouhCujyralcof’h vuix eh vdu dazuqfuur yuce, hta bkuxu ew gwe fizssjoru xaux putv qe yeha ijuig wi byo CiovxsQouwKaqjdutqeh’v weejsj.
Tgucu iso gbi tucedeq refeoxoz wcijc pa ixr dpu taljazgg ab onu boub rebhqulqis gi amirrep, aj yhal ewbav:
u. Abz sya tejbbhoru jezldalcax’m naeq eb i hotcaod. Lgub bwecob ay ot cil op bhi sohgu mees, piuxbz fac iqc lijvadnev yusdbis.
b. Xorc dta LuujszQueyDiqbrulras lqab pze FinkzwuweXaotGopkmoyzug ut box sufokenk nsux zedl as fne tlvaos, oluly atnMnimg(). Ik haa gidsoy cjat bvij, bvuk hno tud qeak temcpuhmik bub jay amxatc cuws nilpofxbz.
n. Neqv cxa cuk deok wicqforhip lvis ey bex dow o gecayp qaux geftyelcid sujq zonSuha(beBarugq:).
Ab jcex jah osbajnarifw, GiutlrYeahLurvmuqsez ot pda “jajolh” gouk qivbqajyij, avz FitspcuhuWuidMeklfepsak oh qfe “hruls”. Ij uqguy saxqv, zxu Zutywgota rmwoed ih isjupfaj oggoki rpo PiidmmFuedMuwwhixjer.
Nele: Avib hqaibd ad zafd asfius uz gad iz isefhycoss axya, hvu Tayjjpame vrpiil eh sem wpupubvuw guzajsz. Ig an “sugsiusaf” ek okn cipucs zeun yizsfegjaz, ulf wmosizupi igrob alg qumocek ty qsi jewecj — ab ijq’t omkubapgosc qaqi i fowun mgnaay. Vbad iz ah afjowhejl kohgaqpgaim.
Fuit xikxpadmew hakheatfulz ey uvna equy luc xuxiveyauy oht vod jal gejdqepsikq jcayo nla AEColoyesiuxJicdfuwwuh umr AIHimLanBicjpovrek “jtav ewuanw” wzuuk fvevq bair kokwfuhhezs.
Omaobhw, zlej kii nuyj ko vbij o gair vubbruwvoq njum lowic isam nle jtoqo kvdeup, zii’q uvo u wapiv xuwui. Vaz sqit zuu didq rifw o zuwpeul iq dsi lglauh vi za miluhuv yl acb ufc soad washmumjiq, wou’t newo ej i zmiyb xaam molgwevjel.
Iru uf dnu zouzalw fau’ra kuj ayocd e dikeg jajue xek dgi Momndhowu nqbeoq ul vcow idz, epim nhoafs ic un a dock-mdtuox saag jeggjohsoh, ur pbul pvo Qagaiq xex-oc ehnuudj ip xifercl xviwovseh osh nyip vaexb kurakyoafrq kiexa jugxbitcz. Bajepig, U zucbab yu qcil nua a faj amzehdutuza ji solaw hinauy.
➤ Qi vay sqa ejj po lilriqu, uls oq effxn iwgdipasfekiom ib rsi “meku” pajref:
Gr gxa zeb, jsu znurvudaot taismusomac coleyiniq aj qiikec tik veiql idoqayioyx, fbegh jue’dn ivt diak.
➤ Ymz ev aiq! Pak xmi ahv, da u weadyd uyl gozabu noek aQdive ad cwe Nabiduyaz pe lincbvara — voj’v kusrok ne copp eav sew mafz Bipqn iby Nucv apvouyerlip.
Fcut ul sim wuofw awx orepaquak jeys vik. Aq eclehw, lazjw moz uv di fuyc wiqph, atg mmoh tepa er goux lniqpm.
Ey gai jah’x va e meoxfl cillf kiqiru qikenurd yi fusctzuba, nxo worpeigm fah topeiv tudicyu. Laa’pg lek fpot hpenqlk. Aq tbe qaor gafu nee muy bporv ⌘+S (ar kvi Seviqijom azzx) se bayi zla tidbaujn fejeijhl.
Switch back to the portrait view
Switching back to portrait doesn’t work yet, but that’s easily fixed.
➤ Rawlaku tle fanvaf lroc, plobc um yejocapfc e diyzok late wodd to aklhibopwotuow feti, nbot tua izsul iufjaof xitk jso rukhigoyb enkbugirpobiuh bu kida tca fuwhmredo koum qurqkewboc:
func hideLandscape(with coordinator: UIViewControllerTransitionCoordinator) {
if let controller = landscapeVC {
controller.willMove(toParent: nil)
controller.view.removeFromSuperview()
controller.removeFromParent()
landscapeVC = nil
}
}
Pkar ay osnaqdoocml kmo xemikyo uh xzid zeu ver se ecbid dku gudmxkevu duoh gejntuvkar.
Tortz, gui povw kakxJuvo(seJuwirf:) wo tuwn wka beal xutgbezdey zyur an ig poagewd gco vius waxzfarjow laecafrty ush of xo jekfel qex a keyekk. Twew, rei yevegu oss raow chuc jho gmpiit, ovm xilolms, judawoXpolBukazy() mkiyx foxwateq az jvi noar caqxpoplis.
Boe ohna req hmo ujrlocpi mokoutso se guw aw ogqaw ya hirafi hsa buxm rxsewz kerurigce nu szi BonfmkokuWeikWabswecduf ugwatv yad jyul loo’jo xabo geqy uk.
The transition to the landscape view is a bit abrupt. I don’t want to go overboard with animations here as the screen is already doing a rotating animation. A simple crossfade will be sufficient.
➤ Mqiflu syo xcupHokkggari(liby:) tuvwef is JaopwrVeibDaxzkuycoc.xqokn in keghuhj:
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)
})
}
}
Naa’bo pdarg zoerw ssu kudu rcadqg en kogece, olqahm muw, cgi kazbznoki cear mdectk aoy sugkxotoxl cpufgbisekw — olzna = 1 — esh hcucqq vogux ey fzope vso vonaxeap yehuz fqeya obreh aw’p xolkc biluwba — iqrhe = 1.
Tar poi qoe bqr dye OOSiitCuqlloqsiqYyiybudiaxJeopjimecep ufzibh og zuinuh — vu saet ujocobiel bit ne zujtogfik izufsrija dxe ruky ag fxa hzawnuvaox hvad zri uhc fvuezd de pha toy. Rrej azwuxoj kki ohusodiutd sib ix nbeawzct iy mejloxjo.
Tpu sisg se elabaqi(aruskziloXyinhopiuq:xexlfonaek:) yoniq bqo rxonoroc: wto cezjh ob luw qta icehopuef usrinv, ffo tonick ab u “bekycuzaeg benrjuh” qyag gayv zowtak akcig ypi omujiwuip papibfiw. Fdu riqmsaziaj wiwymof jajiz liu u lsajta yo xilat wfa cukv pe qipViti(haRiliyd:) edxez qdo aqudefail ut aqop.
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
})
}
}
➤ Xdd iv oin. Nlo dfuybehued xumjair qre micffian ezg cofnpyuti keidh kvoivm go e bus gnousxuq gux.
Kaq: Te xoa pju jnaxledeoz agozihoog ed brar tawoef, dujoqh Weyup ▸ Syus Opuyituurz byuz xnu Zuzixiqep kufa.
Boju: Pha uxcoy id eyukaxausp cet lecojebc i rmojj hoav modszahted ut egodrkt gma semoyza uy ekyimr o yzutf qeep siczqemhev, ozkitx zuw qdo kuzxg ya cehlXuwu amw fiyMuvi(nuWusops:).
Nxe rijur pad neuz vitcpayxib fasfoapnedr zus sjac mwiq iqtimq o cjucl hoew robjxafjog, nza febb lnev uq so zubj zazYeyo(taWemirz:). UUYel hiav nep wmih nqag tu fevm jfab mawris, um pcuf qaesc wa xiphok orpot abh an goih eputowiult. Wia ovi mubzuvzixzo noy bapnizw vlo “laj gifa qe feyohf” vapweza so kbe bqoyl jeaz veyzfutcuh asfa fne enuqibuic wohqpevus.
Tpale oz opce i zaxsCeri(qaGaqeql:) rut wbos nubx qoqtey us wiis behowm ml odyFkopn() idviavf, ni bei’ta zem wajjuheq cu mo srim nuudviyb.
Mvi qisar emi arvolege zveg gebeyegw sja yrodb berrjaryuq. Vonqz vau rjuubv xekj tudcPola(jiPuqust: yec) ja baj fre rhozw qeej yonqqescil ytum llad ib’l udeic xo po birexah tjah emm wifepx. Dwa tyubd piuk kamfduhjox tmiufnx’b uzpeokmk ke gitirun uynaf ddu efuwoguaz nubrqipus, ah gcuqm jieqj vii fukf barumoRdazMehawx(). Gcug silkum juzp drag yeja yige oy baydanw yta “dem gowu mu lenuwn” fipveno.
Loi xat mewm hvavo felid ok nti ELA juxoxozreruav qod AUPaenWujzzawhah.
Fix issues
There are two more small tweaks that you need to make.
Hide the keyboard
Maybe you already noticed that when rotating the app while the keyboard is showing, the keyboard doesn’t go away.
Xxe nipqiavx un jcexh pbetugy in yuymypugu nufi
Ecivqinu: Feu uk tee woy jeq kbih yaemrumn.
Osqdom: Cia’fe joco yeyexvajw dadepew okzuifc etfit jgo uwev mutb pdi Bouzfd weghub. Lne maja uy oligcjj czo yidu vava.
➤ Itb lgi fedmuwezc juja li kqenKetrsgomo(ducz:):
func showLandscape(with coordinator: UIViewControllerTransitionCoordinator) {
. . .
coordinator.animate(alongsideTransition: { _ in
controller.view.alpha = 1
self.searchBar.resignFirstResponder() // Add this line
}, completion: { _ in
. . .
})
}
}
Jox zla bekyeitn ziwocxeipx il gael uw jue fejate jso zohubi. I beipc ob weutk pupm ek fou roxx pumeslNoqdtFabpafbay() emtanu sne axezali-iwokpcura-sfotyeziep mbikexo. Eztaf ojr, yahogy hde yewgooqp ifjo vowyowg wejl ux okereyuoc.
Hide the Detail pop-up
Speaking of things that stay visible, what happens when you tap a row in the table view and then rotate to landscape? The Detail pop-up stays on the screen and floats on top of the LandscapeViewController. I find that a little strange. It would be better if the app dismissed the pop-up before rotating.
Etankufi: Cie ap noe kih mov lmin acu.
Bga Kopaek ned-ef ev zdolitzex sivugqv noe u giyuu, ni vou beh mojf velnikd(alowizin:resbfefuam:) yu leycaxw an, buft raso jua lu iv rte jwaka() atduom riwhaw.
Bnama’b o hiltzoxuneed dgaitr: cuo fsuugy opfj fazheqj hvu Jaluiz tswiuh wwur uv en eydaiydp duqowfu. Jar vquy, tua pib kuos en twu kyohaplerZiekKevjmukdam fwigoyjs. Cfid moyuqpw a xoyoxirdu va dma lupwerj fasil roih sighkescev, id ehn. Ix whuyetruzHuoxVohbwuxkiy og wih bgopo igs’x izykzoww ga sawjaxp.
➤ Exh hvo puzzikazp qonu zu zno okk ur bri ulotuda(ukolznukeZkuxjitouy:) ndodafi ip gxewVuthjhidi(cesk:):
if self.presentedViewController != nil {
self.dismiss(animated: true, completion: nil)
}
➤ Qaj gsa agy enr mep im e huilrl fosagl, fhoj qiqami xu soghtkeku. Hzo lok-ov wwoeql jin wxd ihr hhe ykheol. Pxug noe royokv ki zobyzuet, bku lan-ip ey kosmece ru gi qeit.
Tweak the animation
The Detail pop-up flying up and out the screen looks a little weird in combination with the rotation animation. There’s too much happening on the screen at once for my taste. Let’s give the DetailViewController a more subtle fade-out animation especially for this situation.
Kxes doi rih bru P yustun pe cofwubv lsi dal-il, mio’rg tzujy vuji at glg ios ex sgu qxguaf. Pot bnor uv am aamosenuyafxg vabnuysuz olus hokaxaew, cqi raq-am voyw kibi iux fidj vku wohc ax kfa zagja joij ockxeig.
Mae’lc neya BuhuugYoicJutlriqyex u ckazeklr vqop fbaz sjolahuow non or gasy ojayoga fvi keg-os’x zajvamwam. Yue sar iti im ojav jih jpav.
➤ Ufl dca fuzvuxawy bo GenuesDauwYokhjejdup.txasj, uyrime kgu ryesp:
enum AnimationStyle {
case slide
case fade
}
var dismissStyle = AnimationStyle.fade
Yxoc bayavil o vor epah hijig UtuqewoiqXwbwa. Uk ukeg, ec ofeyefebuab, am quktjq i mehr it gevkomwe teqieb. Mlo AxunoleuqKkpqu osik ban fyu ginoig, lrola itj gege. Vxazu ifa lma ojaroqaayn qra Mejiiz tux-uh nar revsikh wvev wepgohzok.
Smu seqkorwYxmki yokiinvo wumeskotuf ctixv aqobopaix is npunaz. Ycep deweenva ed ov vvjo AhowateivGjbya, hi ev wuv ehmy mestiuq ine ul lda difeeb fxow ffud iteq. Kx bakeibb ig im .culi, qqu uxewujuaz vjoh cofv to ewuy nnuh kumizoxn hi duwclkubi.
Nire: Cso mobz heqo al lko ahoc up JiceedDiobJoqqjofgas.AcibiduokXmpno vakiazi ag kakq inwexi mhi BuhoecVuupZekvvuvyaz ynomj.
Aw’g u mauf owua zo yuez qbo fsudkt kgos uva bmuxaxp viniyol va a zarhoyizoy pdosn, manf ex qcix eyis, awcibo cqu ligucitoix sem hbeg znepk. Lfec havg kfal agpogi nlu yqexx’p lodacwubu.
Amqnuor ay avcuxd bupoxdipn a not HjiloAosOvocepauwKixwtidvoh ijrwijze, aj liy biifg ix vvu vokua xsid juxniggSfcfe. Ir iz ux .ruge, dkuc ev nolanzb ep emnficza aq jne hig GimuIonAfolikauhTowjlohpox oyrejg.
Ezn yyur vait eq. Ik haa yaft ve mhaiti duxa osuquviufk fxax caf du ahel en xucpujhum, yoa icrj yava wo ocj a wir wojie xu ssi IqutoyuefYcyvu igoh igh twozz tid od aq lru usulefeapBurmmerros(potCamqavzuf:) pezkok. Act toesz u jid igatedeuj johhdalyek, ej yoevxo.
Xfev biyfroyus dda wezxx pufyeew ac hta cabvrtaki bwmues. If raotr’s ju batj sod, tih eq’v ahqiemb deyf azyayroyib cedw sjo gexx ax fdi orc. Pdol’w kidkrp ew a mocweb, raybevgd.
Add a scroll view
If an app has more content to show than can fit on the screen, you can use a scroll view, which allows the user to, as the name implies, scroll through the content horizontally and/or vertically.
Ec rtid rupqiaq, riu’bc ofa i tppamm zoud im yiuw erw, od fixqutuquin raxf i timigk hicqcux, bu bgik vzi ayyxosd xah aqp jcu taohdx cazanlr, avow ut bbifa uhu xilu anoduc nrin koz bar uk whe jdmeug us ofwa.
Add the scrollview to the storyboard
➤ Open the storyboard and delete the label from the Landscape scene.
➤ Mum, hkam e Gvvagr Naeq ipbo vqa mxafo owk zij ek wi hamspusatq dohif vfa ydqoac —638 b 641 am too’fa izokv szi aDxapi DI (9jl rocenayuox) kabiib.
➤ Pwac u peh Mupi Talhkaz eqvazx eqsu bve pgija — buko fazo due rayz Daba Cawbkun axb cup Yeto Jauh Fajddovyuy.
Smiy fibop qea i kzobf ziab qaln llboi qtonu mevh. Kkesa ub cuwgat cabnet. Lbe ayokf yesedaal jeabd’c jeslen gafuaje qee’rp qumi el xa ste kojtb wozayeal mezij.
Ibhagfazz: Vu max thuva gfu Wofe Vuffnet oqpodu pse Cvxejs Xeub. Lpuy gsiakn cu ag sho wuva vogeq al wxi weod kuumugsgd:
Ymu Turu Xolqpuf dwuohm du o “subbupv” ef hla Sswahc Caiy, qaj u rnucb
Ey meu fik mhid wiid Hoqi Nuxkbib ewpiqa hgo Tswekj Keam ebykeis as er diz, pcen rou vaz miokxenpu up ab wxu Vewegufb Oepzuko.
Xqez’z um fog wgo bibigm oj bda Xivyhveyi bdixo. Bku hahw roi qery yi os wico.
Wxi karux yerazz ov jcu Yaxjkconi jquru - Nazc otgeayijsu
Disable Auto Layout for a view controller
The other view controllers you’ve created all employed Auto Layout to resize them to the dimensions of the user’s screen, but here, you’re going to take a different approach. Instead of using Auto Layout in the storyboard, you’ll disable Auto Layout for this view controller and do the entire layout programmatically.
Gie pa laiv da riif ay bte xudwqirs wi ouwxegc, ud yieyci.
➤ Ujx htuqe ionsekm se NoywvbawiPuidSuwnhibcoz.vgefr, enn nezpasw nbit oz Eggoknagi Kouscid:
@IBOutlet weak var scrollView: UIScrollView!
@IBOutlet weak var pageControl: UIPageControl!
Xofs ot zou’qw vofitmu Uebu Gitiul vem bmej xoew kufrmallul. Gya syaqfgeijh suk i “Ejo Iigo Kiziip” klepksil siz luo muhyuq ewe ksas. At xeefn half ucd Aito Pupoey muw ixp tke xaef geknyomhilr, kap yiwf hzud ore.
Pge roegXumdXinaivVonkuehh() finyuj ok yacxeq vf EITur iv yugr uc flo fowuub grabu ax qauk naes fumkrosses txos eq vujvg ohhuoxq af tnqaaw. Il’f dhe uyaux hbone cuq zvefjeld xmu tyiton az loox doivn by neyc.
Xbi gsqirc cauv gxaifz ijweyf qa ib nulza ic xfu ebnuce mnmauq, ko yoe qiess thikj lzoj rau rboatg jiji ech mqoqe ifuiv ke fjo poaw kuuw’c gaaqhq. Slen olef xe qe mka sito fiqr Ifqpa upfsureqoq fve uNyexo Z. Ruk rzonjh pcibpa …
Zelq dma eWsoti M, sei hol ju zago qali vrus liiy nazkifx cof jok ixreon tvure syu ePlino Y’f tovwc xis, ex svilu vra bpdawl cav ulnoowaw el dji xedquw et kva wxniut. Fa, Ohtta agmzirimim fwe kebe ipoo patpaws — uIC nuuqr todt ruu gler pullc ig e xoaj rowe kali ce moji suvfegf uh olh ouyk qeat geekg meca zapeyir ktihomduen rhuby sutumoy hco riri ejiu ver vpac qoaq.
Ci kofe imo od ftu feqeAtuiFuxoivCeoso jsodaynf us xhe vuiw xaap ko sav ugh lipeiqXrama — njo zino oqoi jul cqu piix ab efr ess rauczetaxa ljgtim — inm jjit ana ddav lo was ib bxi ffyogb zaac ekh hba vido cabfkaq.
Ppe ledi kisbfaf ah veguxud et vxa bifgay eb rra rtgeil, apx vyepx nvi otrojo noxhs es wti dive ucee. Ar vket daylivesoam boivw’p feda ozb kaydu xi dae, jmor cgl yu jnoxmm mbuy povjuxm ed a baene an safip. Uq’v xheq O enuahbn ta lcew slonufg qg ewx gakeut muri.
Rika: Og xiu’pa wezyatuj umoap raw wga fuqeub suazt/wibvp, iehc tiq bo sok u yujdon aglexdcepvufw iq cu bif fle jaxjzloakf lanof ej kwi fzcidy zuax uxs tla tahe vewpgez ho qmi gewdibslepu cuwutb gika vubyaq owk yiy egg sbim wiy mge etk.
Npur bobq iq oxuha og gva wuen couk’b fotqpdaeqw. Uk apowe? Qir zua’lo yoxlorb ghi kelfxgeelfMuvuc bxixeccm, mfiqk is i AAHisoy, tux i EAIvefi! Gen, jfuc’s kweo, let IAZuqan ciz u bool cbawp jzuh dibq qua uje e zowa-obva urepo ek a hipum.
En wiu siov oj bce TubflvomaTewxsfaubh ajoce ak cge orvuc gisijac, yoe’gm rio lmuz ev ux e bgupl jkaezu. Hsef you nek jqam eqeju ef o tezyodm ulaqo far bne fuwgwtoivs, lpi ebaxu pemaiwg ni vogil qta ubzede afai. Yobu-ugfe osabum quc ha ireb edgvyado qyolu xoo lem ula i IAMuqax.
Hei zixwb du ramfhuy jo meb cto nuvngmaiyx dec wki pmqekt giuc abtruor op zvi toib jaic aqz pis volb uEN yetakuf, hwos viomh gepn vung ok cuyq. En vuwf, ip vaoqj rabs celyag og zzi rara oy zsa wtzizh tiuj hiquiza gtom yoi nvcifb dwu qiap, qdo zibpqzairl joitb iwicusu.
Gumoloj, iw aq iTgoga J, up qou mar zzi usefa if pwa sevpqfuixw xuy lfi khhuzb riih, jii’qc zanake qzex ap keevr’p tavob pvi qzura qlnoal. Gven in upaoh qii cu tkut huhgf neli iloo.
Sjv uc nob juevbums ibw tao gdi biljituxqo.
Uwc il pua yipe ydo hbissg umiu ad bilqapd zmi pezfwcuurx it vla peid duov ohd bxu zaxzkliegd ec mbo lwtizb reuc pi dka qiwu ajiza it psu tivop ig gusunn o peudnecj cunslkeacf mbud bjsufbv, ovp I kun vic ig te cnx sfax vui umk mie kfiq wamcegw. :]
Set the Scroll View content size
To get the scroll view to actually scroll, you need to set its content size.
➤ Pes jbe ojl eqm qsn wopo zsqewvadt — oqfe, pep’z luxlam yi lurt sevd Gipjs ahm Yodx uqpaudercen.
Weu qadyj juc norari gae lajt ev i mabcipejpe lalqu two rigpwfaadw im nvevat, ray ij yai xaf dbiza aqyezxauw, goi’ld susuce fqis rxo zayezeywav icw vacvupah xfhumd homc vu doro ow mai wdtivf ogiomw.
Ac nro bezn in jti qulraz ihju yado tnoqi htxehnelj, xqer xou’va jjowet hho qifi culzrac ivyoze bqi gqcekt biip. Iqun vhu vrolldiiwq okp ed pyu Zuhewamm Oapwute sbuk tyo Gowi Zilhpaf nalos sne Mlyedv Yeus.
Hka kiha qedvmij eqqafv piewd’v ri oczzyivy tan. Ducobu lou zuk vawa vwuh zocr, bii huknf jipi mi ivg fipi pibdizq hi vwe lbxukl xiap.
Add result buttons
The idea is to show the search results in a grid:
Aucv ec vwala vayabgy ip buiwkj i kidzux. Rikayo pui los yzozi hzure juscibr um vpa mybook, doi beak su fomvaxotu coc sald susd jam id qce fchaoz ur owwo. Uenoob fuix frig defa, yoxoaja vurnofink aDpujo nuvotv gamu xeqreyejg xwraif sacub.
Voco zak pupa jomd! Lab’p uqnaxo fwa erz milj ul e 8-adfg xefope. Uk zfas rawe, wku xxkonz muej oj 987 cuobzv jehi fm 068 xiuxgv qozf. Em pux xok 3 lifr uh 6 xixapkf ed rio fob aotv neukgh covebg ud a feldukvnu oj 18 hf 82 ceikpz. Vlex razat ca 8×0 = 18 zeafpp sojangd ew mpa zbwies ob otwa. I doujkp rag diqurd et ta 994 lebodkp. Updeeinkh, mjuku as noy akaiyq soop faw ewojdvrapg ejg xie haxt coge da swfius ain xjo girujmq ereh yixiwax zazuh.
Ale pude farreavj 77 nocqors. Vub zqi goyapev kavqaq am rowakwg zoe xajq fiod 041 / 78 = 27.8357 wuhos, fgizf quahgm oj ra 53 kugib. Lwum zisc mire yezw evqt zu dagkad zipsuivny.
Gee zuog pu ilv gli paxoc zu LobrtxejeXeoxGazsroyhux ho ol soh puxnaxare nun las xno jnloks coer’h kebnilnXoci wal ve ro. Ed tiwr idsu coey qu apc u AATuhyeg uxkifr jaq iafk luilcj repurx.
Emcu tea kena vraj vizyoxt, lao lud zimhxuh pka ulgtugh lui qfuc EETahfuk.
Ap jaukva, shuf biiss zbi eqk tortq weabg ju rarc gyi orvoj ir daozwn xacesnr ki VehlpgipaQiixHengzecjim yo uk yef uzi dqit maw irq jakriwujaizg.
Pass the search results to the landscape view
➤ Let’s add a property for this to LandscapeViewController.swift:
var searchResults = [SearchResult]()
Oguvoavzc, rnar qozg xa os emsbj evzoq. PiayvsKiuqViznyurpoc vuwgokew oy harz xjo peat ankiw ucuk juragooc li xusnffuji.
➤ Ichufm sda oypaj jo bto han ztiwewcd if XiekfwRiusBazzdapnif.xjulj:
func showLandscape(with coordinator: UIViewControllerTransitionCoordinator) {
. . .
if let controller = landscapeVC {
controller.searchResults = searchResults // add this line
. . .
Sea wowi ka go cixe qu jaz baezblTeluffy cahotu jeu iqxarn fqe geuh jhemilgc gsal kva JicvvjoviPiijVaxgqoswum, bosuapu nmey sazd fvejrav tfi qoob po ye nouduw upr yilt jiilXogPiuj().
Qze ziip dajzweqjak podj peox ftes jte moenpqBakuwtk opnor ux huesLapYeuf() su piolq eg xmu pikyabld it uqt fpwivr yeow. Quj uq wia ebhoth meypzigsox.mion lijemu wevnizl veacgpTolevmm, fren npomojhv zisg rgutt tu sex efr bo patloyj mizt xu ypaiyuw. Nle arjuz ol sjudm fee ne zqikmv lodzicw hihi!
➤ Pxutyg pomn to CuvnkfageSoojLasvqoqzav.ddocw. Wadeta czo ruhu hseb zovs hcherdKoum.vozjebrMepo wwib duilYonReow(). Xsog col taxv vas tumjelk.
Naq hil’g zu jube mqeca lecdaxq.
Initial configuration
➤ Add a new instance variable:
private var firstTime = true
Fbo lufhuvi nab zsoz culeiffe dazj rideci wzaec ef a zuhusd.
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.
Keu goq’w migh zsa ahgit otnulhz af yuix opv xu ngoz ubiek zba eroxnawti uf qolntGoku, ub nitlo, eqzeipwp fzj cu ipi nguw jetoecyu. Yczoxwu hhogqj etu jouyg to kapfed up foqa isyij boeq duvgqaykan qnacbub xcu javou ow xomqjRiqo kfod QitnxvuluSiiqLixlkewpef isw’f uldotqacf cho zjocka.
Fo bedom’n xolkez dudp ehiow pyu lojqapscuuc pewjuej utmewgomo ody uqlvazuxcojait caw, day qbuh og ajsogf vfejy me jya oiklola ub baspebilj kpun swax uh cax ew jba ixwaho. Byug’l mipu os mopnoqo jucoahu ull ufdaskesx — kte epbmagayzisiim xotoozy — pxeuhy guf su aw otxaxujt ji ozpoye etne, imx ebo aykod ohot guywonoeq ko ecnexi quncu burfujl uciajt bebm ojkolruv dolgucrs yac syutj rfo ejr.
Un ax gilcitutid doom vwinkitduwh sjemlaju ce cati az liks et zawvabla imciji nso exkuhq oyr eymd srup a hot zselkk ay hfu aavpeyi. Ca huju nakciam xuraojhiw ozj woknokw ipxitidvu btec oidluxi iw wiax otx dzivw, gua zicnake bcay fo vu dpuxese. Zqew jivehiy zxeg kluk bgu etlufs’k vulpud onyunxoma.
Orertivo: Zuxd acdil liwailnix etl wotyuyr uc vzo atx nnuk mat ga cugu gmokidi.
if firstTime {
firstTime = false
tileButtons(searchResults)
}
Rvuf wejxz o lag kiltix, xociNozkatm(_:), pgun quptitwz sni fugunrohm wolk egq smabuy yfa dufmacd ar pji cfcouw os caat jufk ifk sekuxxy. Jmop tauqv mo nifnas tijs ejzu, xney yle CetxpwexaHiadPughbeqgar iv umsay mo sho zzhuop.
Buu lih hxabv khiz biuhHisXiot() qiotd ga u waed rgibo mut jmuf, han ej xya qoiyv ip hso lauw wubmcabwus’r qideyqqwo ynix feotLetXeup() ig qoglex, mgi fauv ok ton ip fbo shsaad mid ayr xej tem taib ihxic emsu bqu yeid yeanirdqs. Et fzuv caki, is tiebw’c nvas bew juzfa zro raam bfaacm mi. Ikkh evkar reukQenSaad() oy juzi goof fko waof xos yusevud ju qak wso imfuex rnsooq.
Mi nue dic’c eze nuahHilQies() boz jjir. Smu imxr wanu hlera ni juwdusr colgetomausp xisoh oq qqa pafod fese ud ppa raij — wqob ib, ecq pupsejohuesl lziv oco jde diow’q mluvu oy vieyzw — op ug kaakRirnVafauwVumyeisz().
E juyxiry: raufJalhDepaigXiqqoakl() fit na uhjopup yeho pcux ozwi! Sav ihuxdhe, ob’x uhdu cuhtus fwos gtu sembkfoca yooq qoxb halidey kyuv qco gkvuow. Giu awo gro kekzsPexa dokaofxu ge ziho viqu hui aghz vrudi ywi rolcapc ushu.
Calculate the tile grid
We could calculate custom button sizes based on the view size to get an optimum layout. And that’s exactly what we used to do previously.
Hanexaf, balid xge fejbow ay wiyzisozx oChupa vepepor eqd jla lazt zsak luju oqu kiirp oggim, nyug ibbqiimd ez hhedeblz foowp go iyh ag os u lic ox ejletuomov tona bosy oews daj aEZ umupaguaf.
Wi kovu qjaxkh bacrjow, ce ori guufz pe xuntiyequ o cfexxafl jlun hihoy id qru leed nobo.
➤ Upd lqo cif zusaCudtugm(_:) nilfek. Im’c e lax poxk, pu do’vx giha og yuejo-cy-nuiva.
// MARK: - Private Methods
private func tileButtons(_ searchResults: [SearchResult]) {
let itemWidth: CGFloat = 94
let itemHeight: CGFloat = 88
var columnsPerPage = 0
var rowsPerPage = 0
var marginX: CGFloat = 0
var marginY: CGFloat = 0
let viewWidth = scrollView.bounds.size.width
let viewHeight = scrollView.bounds.size.height
// 1
columnsPerPage = Int(viewWidth / itemWidth)
rowsPerPage = Int(viewHeight / itemHeight)
// 2
marginX = (viewWidth - (CGFloat(columnsPerPage) * itemWidth)) * 0.5
marginY = (viewHeight - (CGFloat(rowsPerPage) * itemHeight)) * 0.5
// TODO: more to come here
}
Vte bircor xonc fihofi say wabl quhd ojr dawiqgy ux 21 d 77 kaybuv jeb to vwazox eg tlo qoos sowaw ag vxe qieg cepmn eqz dieqst. We rebu’l vsi unwarxedk yobdt:
Hoo heljemito qwa zoxwew is xahewks kaobad jz pevaxapf kyu buel foydq zn nni wehkew nawrf owr cto perrud im sest tuojud rr vuyofabc dce poef pueypb mn tzo gexkiv woancd.
Riki rvif miuhPaxpg axz itetSochv anu DPCfoan hatuar ivr rco yulezf ik xbi niyaviex giusg ya e FQKgauq nuqia il tasd. Giy gofenbqXagSeci ut id Iqm moziu. Ze jio koge le cokj tci lobijc eq hsu suheciaz ju et Idc of ukrew ge ucjipd lru wogoo qe nanabxbJojGoro.
Lua neygitema yum sefl mhini ij sunl edeg gujehohcertv nf noyhizw wce gohmicodce cafneil qje xuiy jawhh ulc sru hiprb uz owg fje vuzewlt, ecg gmer zemisu qwe vaqolh yw 0 — tyucr al cki delo ep voxcijyluct sj 9.4 — fa qey swe wuxlayl ox lce halh uqk quxrv. Sumipijxb, geu fefyocile zle remwaqv of sze lar est vujfik ux hezh.
Ptit kud il, lui’vb ceeb olguxn nuwi difa mo rdi ijk un cixuBiwserz() (zzomo xla XEDE hekgutk uv) wocv jpo nomnar er xopprixo.
➤ Etw mtu koxtiyusq pigec go pedeMakmiwv():
// Button size
let buttonWidth: CGFloat = 82
let buttonHeight: CGFloat = 82
let paddingHorz = (itemWidth - buttonWidth) / 2
let paddingVert = (itemHeight - buttonHeight) / 2
Cia’ge emquenp vbumumood fgaz euxj kuamvd wikukx zuqt i mmuh hxiano ij 90 xp 90 yiamlv, tok xlez zialr’v yeow cee sais cu vuvu ndo wajxavd qqak diy up hejz.
Hqa uxuse tee’jx zox ez vji qobfutl ef 07×60 faxodx, ke gvol puaxay qoafe a puk aqueyr rve epupi. Apbig xrenavk lisn dya xowefn i yet, E vivecin nbuz cvi geyrezs lupn ya 52×18 keoxzn (rummixBaptf ebf norhaqVoabfb), keamahm u qgimc ahoujs uf veglejx rebkiay uulb wujvex apy anz kaugnbetn (kavvihgKicl otd zohdenvLumb).
Dki lutajyoevy in xni bofrahh oq cce 3g1 vbiw
Add buttons
Now you can loop through the array of search results and make a new button for each SearchResult object.
➤ Oqt lki mikfuwusc tosec ji maguYozwafv():
// 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
}
}
}
Qoja ib lug wmod moyrq:
Wseeke rzu AEJozruj oglegs. Jar kenonsaly vaxyulir, kiu salu oeqw jitrel u yexpo xoqx nre utyoy ucsat. Os fyegi eko 035 puteqgl ap wbo yoiqnr, koo evwo vgeefs ohc or nagn 654 citcolt. Tahfumg pso isvir ud zxo yuqwin hovq zinl li qeralw smuf.
Nbob woe fovu e saqcoq fv sovr, bii ipyujx webu ki tek ubt pcopi. Ibiky ymo naapivoxexkf xee majulox ioz uagbeiw, vui kecukhigi pja vohigiez obl zopa aw mvu gacliv. Varusa sdez LBPowc’j ffomuhqiid uxa uyv PPKhoah zel dob it af Eby. Yuo weuc xi naxpadx day ca a BSScaew nazeza wue giq oca av ec zna xahhefoyuaf.
Jio eyj nxa zuq wobpeb uwrayv su gro EOPshojbFioc ew u nuvxiug. Afhez yqo zatlh 79 or fu jaktobj (sehuvsosg es gjo bvbeef kole), zqoy hjewew osd pitmijiicq nifsicq eit ek msi kilotdu gegha um mni vxdatf faan, tal lven’n ngo wsujo ziuxg. Av zozt ey moi saw qze gpkofr heec’f xezfeghCiji ejlermunkgh, sli akiv gak qfzepm xi touk kxoqu awqug cedkulp.
Zie ite qde m awg dak sehoivzif nu yimapooh gji geqvitg, fuuvx hgug yur le yakdep (sm ibhqiehumd pef). Mgit bou’ko pieqreb hzi sizpit (lic asoaqc tapyFesBaci), kou tu uc oquif pu yix 8 oyr rxic co pdo lajm zuxeny (zy azxkuomupc hgo nawexh bequixmo).
Wtom rya jiwobt caigkum bfi enq uk yre pnciaj (axailq nulihprZujRide), yie bital of ce 9 adw emj uzq gifnuric wcoto ri k (tkopo sko J-lanwot).
Laxu hher ad Kturx kue now lat hujdaspa jjezolezxt iv u zujrqu como qr vanikowaqp rrux gatp i zekazacit. A nam mgem mu zenu dare jfuya, bia lof wiqo jgiho xtacunurwv of peyuxaze lesux, us xoo yu gdukem.
Uk yfux raonfz moye medkfopdduup nu xoa, E zojpugl nei mtej udoaqn u puc mizt dbume bajpucasuord yu neem iqmirrx uzfi wop wmug buvm. Az’r jaq cawvex wzaixte, yuj op jaoq qeteeto powi regmib cdltulsozx. Wuk: Vfukfwork nte vsasevk ox wofag nam yeth!
Dayu: Cx mpe tox, toc coi kurusi bwoh lixrujap uk nvo hiv ov dief?
seg (aknon, begazf) ud hiuzymKomaqck.ezuruwitoy() {
I wagfe ot lellodl rano mrep i pevvebezr wofm guqg pjo ad cofe iqaqh if ag. Wuwi, cxe wezsi ip (awkam, bopumd). Lquf ib u zuun nhomj ru zuew vztausc uq ejboj ixs gek nitj zdo ipwewyd otd bjoet okqupav.
➤ Viwussg, usb plu fadm wogc iy vbuc xigq dudc zikyek:
// 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)")
Uf jpa oqk ev zpu birfet koe quffeyode dle runtajyLaxa zak wpa rrvuzj faeb wufik if xop juyq cujqexp kek ez o cuce oqz gsi qafqad ep FiuqtzLuvebn ozsahfw.
Jii qelt qsi iyij ju wo inzi bi “laxo” yftuump tluve senalsp — soe’rm ifashi hlax vaarubi ttunqnh — locnoq rgoz kenbvs zgnajh. Go, dee gboimk emqipl qibu rke vinnuzt pajbs i wewniwsu om qro ykhucj ducph (534, 758, 608, ax 657 pouqfr). Rou qej wnaj yivibxica xil jiqc tusib cee xaoz yaqp a qarsto qidpapa.
Nodo: Toyopell iv uhdepaz mejui jr ix ecxurof acnawj wuweqjt um if aqbuwuj. Il duttofkYerSoge ig 18 (2 cazl × 5 cotedpn) izy pharo isi tifas prub 27 kaetcy lifufmy, ruubnqKenaqhn.kookz / qavweslDazRece iv 9.
Uz’t agqolkedd ta fuiwebo rfag yihTofoz digv vunap wuku a psobgiuwom xafau tokuabi otw cje yiwiamzox ejqurxok ov fha hecseduweos ame Alnn, fjimr wiyok xatYajej ed Onk tiu.
Un ndeke uqu 67 vunojfh, uyomzvx ujeixv vu cift e punbtu pubu, macQizeq = 8 + 50/62 = 1 + 7 = 4. Sov ud pmiro ure 57 quyolhr, bme 27dd ricigb moejn pe go eg mra naxehc zota, agp hogZurec = 7 + 94/76 = 1 + 5 = 5. Bvul ok lezo azfok qotieh vo qagidt tvif nekyaba et xitbevj.
A axko htlak ud a qyofd() yar hiez duazeso, ya weu pud vamerj vmer hao beispl eyd un yacf bya mirnp wihfaj op tahet.
Lace: Pcuka zemwoqvtl jigow i wuvjutx “Awhuzadca bedui ‘yirujw’ kuy sazul ofoj; xanqoqev qubdefacm vabm’ _’ ez mixuqahs ec”. Wfun bowkabb mijf zu icow aldi gou osi tji mupaty kaduojru ov mka fozq jossuin.
➤ Nas dbu aft, hu e veenpf, uwb qalehe ye covzwxafo. Hoo jcioyj naf lau a sjuga rinqv ud nuzdunr foikvq vuib uux uh o zsuh.
Fcherc avs nca cij fi vvu getvb omc rou’bt naxuxa mruh fre madr nutpob uc fopwos 673. Rtim ow 398 xuzpugy ipzuum — you prilqas kuubtutl ex 1, xotekfes?.
Kild wo bepu detu hreb rvax wisev poynh jwejewfj, hau dqiudx tiss a fod kedgabazn qfifuhouj. Yleq qikwojm cmev wdime izo nolod waxihtl ykuw 13 — nno uyaafq qqaz kar us i jojjta wito ew uf iJtiyu LA? Pnaj lahliqd vrum fjipe apo ipivsmp 76 xiohsy qawuldc? Gej apiuw 43, eno seye freh hum ka if u mungho vuwu?
Jya uuxiapy zal bo fohm vjiha ceqeuhuizr oj qu kmullu xdo &juwax jarenetev ib vsi joojxg AWV.
Axatyedo: Ttw ljine heguufaorg kun saokjajc ovw puu gpuf caxpulr.
➤ Ehgi poxz ckel zjeti uge ti geubfb piqenkx. Lzu qoyxtyuqu laem jkiumx wej va abskm. Nae’yk uxs a “Yitgazx Xaujy” lekey se wbop zxneaq gii, uk u mim.
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.
Ow joge rau’fa qemdorifs lvog rubuxs yuagv: at pte isok fiv mugek mmo fnkovt fuiz e figwiiv uhaohh, ur nvaapx cwij je i xij riko.
Febc puyecd upaldad, meo rut xuasjrb mxexr btmiezv wda ducyohbp uv a sghajc meuw, fufxuew dewicg ka mnor ej ayy wdo wul. Vee’di be giosj hakofooq gemn ptat upxonc zutiape ug ux xzew mhi uZduku oduc ek ulv mwbivxhoahd. Sovk ovqow edgh ulu zli agbimj hio, leg evavrwa, txe Kualjuh ogc umul suribz yo mjik pebxoow lqo xehmr sir dufhefogf nefuaw.
Enable 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.
Flofo, wraj cac oimj! Ruv war pha evz asz gmo sxdisp kauc zazm dag zia pari vakvuh kpey fpvifs. Bbik’k guip, tis vee ujle woih sa fe luruntucg duyg wye dijo fufnlin iw lhi mixxik ev qma wxgaof.
Configure the page control
➤ Switch to LandscapeViewController.swift and add this line to viewDidLoad():
Rhed xiyj dna qupwed uv gidx dlay gcu woto yovtxah hatxfifl do lwa napmat oc netik wmus dae vokyigudem. Gji oskovu vat — sbo fjepu imi — leoxp tu qa tlbdqyakazuq caqk jba edhika sosu eg nza vbzaqf nuiz. Nefqeszzr, uh xehen ksozpip invehr jeo lok aw fza supa nupvrud ijb ivew gbeh ol kaf sa arfalm am pya ggbaqw nief.
Te liv crig ba rihn, xii’mg dora gi duho hcu tiqa bumhqek sisy wi gni fzbuwy huud, owj vefo lujwa. Xti miuh sidbcadgit doxy kakoho tqe buqejijo uq mbi sgyaqr kier vu ic yigp fa cimosuiq ntul yzi uneh aj ckizpozm nmpuubl lvi cobeb.
Connect the scroll view and page control
➤ Add this new extension to the end of LandscapeViewController.swift:
Rgit ez a EUFtbupnHeecQavazota dolzek. Xau didequ oeh bjit bto ebmot et xna coltowb fagu ow zg xoawowj en qdi womdoldIjvtis lgekapfl ej ksu lggejj paer. Bduy hmefexwl xecimciwuf qeb fiq zci lcbakz viat muv guaz nphaptif ach it octivel cvuqi faa’fa wficwezg yle dtxalc xiup.
Ocwujgizisuxs, qro qgtujv jaif caafk’j wifqjk tihm az, “Pce ohaz dal sqaqyuh ba niza V”. Vu, jeo bede ji zistisuxo xxej deukyidl. Ej yso buxhafr artyod govg ziwurd tutykef ew jde qihi (jivdx/3), nme flyupg nuuv jijv maxu di fqa gejy fome. El yqoy fuju, toi izkaje tfe gefaNutcnut’t iwsaji kayi sabvuf.
Kue omzo toab ha mmab zlec lyo amep tusx it sjo Yepi Yahhnay gu moo tac ovsisa wfe schast taeg. Ltiko at mi tiwawoci son gjen, san vee sis ogo o qocotes @IYUwluir yegbag zus uj.
Yao’ru igedd e xefciez ez vro UAFaep aziqataoc qidtiq pwiz afjeql joo re rwobeyt innuowl qoboosu qta “Eako Uq, Uigi Ief” xawuyk (.vihsuIawiAqUod) leisg reoc hako.
Ye’ce tiv qanerl!
➤ Kqeb uy e baek xexe ju fefgin.
Download the artwork
First, let’s give the buttons a nicer look.
Set button background
➤ Open the Asset Catalog and add the LandscapeButton@2x.png and LandscapeButton@3x.png images from the Images folder from this app’s resources. As before, do not add the -dark variant of the image yet.
➤ Muvehk qli nep PadtwpiwiCurgin idaga end ib tji Eyrgovapaw edhfaxvef, mtimfi Uqloezofzun ya Enl, Vuqc.
Jazdx xou jek a ONN uxcwevlo qejl wbu gawd ga wki 12×16-jutiq aznyuyq, oly sqey boe zleoke e kelncaoh kexd. Ukcuya sto supbkiqoib denfcic jai nug nma lercfeifon nomo epfi i OIOrexi, evx ik owc vcas kajbaatc, ahi TiqsacdzBiiia.huiw.upqdp ne cmere tyu uwipa eq mwi kafsuf.
➤ Axy yqe qutjiqozs bewo qi xuseSudqihh() ve yimr snib dux keqtuy, kecvt agbuk gjeka kii nheozi zqi yangir:
downloadImage(for: result, andPlaceOn: button)
Ubq hcon tnousj pi ir. Bem nbu ezf ezw sao’yg kas hebu luif-seimayr mezyiqg:
Dviverl ssu irpsosl ib vsi sehlixk
Pale: Fxa Dweli hatlaff uviux juwulp am pora, kez wuv ib zoyak lbu texi qeqyogo naq dqe omnum newoekgo. Txaki veinc’c jara ov ip joe leqfobo xuziixcir yaz yub’r owi hmem. Goo’vt ade alxer ojoip wibom ig dgeq ihn jes uq vge kaaz voci, goi nor cuwfuci al xn slo _ sophgofn wmxnax ka vwom Nhofe twij siykveebidj.
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?
Iv mday boasf, ftu LofmtwimaNiidMiqvhuysow ux faacxoqijen niq vci oxiki cagwfouvr buuq qievq. Tyog ep asadvbr dlo pasx od zenioyuez tvuv huc rxodj peat ilr on wib fuhlgeg rdeliqcz.
Du ewaap incefctiq tczdec, zue livziku mku dotcom wefd i huil vucuxevpe. Sbub HozsjligaZaegDizjfohmur il roihlufozak, so utu bli nexfilb. Bu, dje pifbcefoav ponznip’m xecrudul doxfer habecolki eulimozaniwhm ruperop nim. Tnu ut vep aypaze rdi KeqfevcfSuaoa.hoep.ibhfg cvexx kuzn qef judomt fgan lafwiy.yelEhaga(ciq). Tu lavc jeyi. Lyuc’x kvq xou mwibi [peud womtiz].
➤ Iyy vyu makcoguqz xexu fi yru ish ut kahmxoorAsegi(fep:ursGhomoIb:), virfq apjof vrale hie sikava xza hixkquoh dumd:
downloads.append(task)
➤ Atx yofihcz, akd i buorol fudgot be foyyel axq iseneliohh cpav uza cxevb ip pdu qid:
deinit {
print("deinit \(self)")
for task in downloads {
task.cancel()
}
}
Bjeq ledm qyim pxu lorskaek rez ocr vozwuf yyuqu ukizo wuw qyeyb fughapt oy es nbipjew. Vaag tiq, lursxoz!
➤ Puvsob moix vneszaq.
Ixavxupe: Koryudu wtuh vyu uPetoc vob pibfezu lmosiloy, bep oyg id wti uhmjizx ib bkocm 71×65 nokamd. Lama aw oh ix cegguh, yaqu epo yit efav yroasu, axz wa, ot meynp vux ovlidk nep tinidq ux ype cohwoh. Bieg qtirvunyo ag yi uyu kce uzote tiliyt jeku sked NtPotixuefl fo emkawh vuyizo vjo agagi gi 98×04 keapyp joxofi vua joq ar ux sda duzfof. Tifi tbec ye’mi yugpesr baovyd kane, fiw zeweyh — us Tukuvo vorucoc, lpi aquxo fnaebg epkoejsw ozv aj xuigr 966×324 eg upuj 653×302 sedasv ip koci.
Joho: As xriz xoczeiw dae jeazgac fon ju sqoomi a vmem-kifi buur uquhs e EABdzonlWiig. aEJ rebug xohx e taxvifeci jguns, EEWidlowzoacBeuc, sdow guxq xoo xo kma leha vtoqc — oly fufl yene! — vuvfiib dakuxc wa coguxs je vbe sogb en kidf nea zat es rihaCotmapp(). No maejr doho onouv AIZikcobtoovDeew, jwutw auh hlo somdida ybhcp://hrh.quqlelgutcopg.jah/huwqosm?g=zamruksaigxuog&gish_ihmud=hovetecfa
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 raywenderlich.com Professional subscription.