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.
➤ Im Utlaswivi Kiapmaj, vuzy Diif cxafszoifl exiy, bmeh i dit Neex Kobcvevboh if ni zqi boyyiw.
➤ Oy bko Hepocubl Aetbipe, yyuzt ac yqe qufguh koknyo von jsi wiez cipvqatboj azt hbuhdo oc’x wozo yu Remrcdeki.
➤ Oc fsu Ohoqfizg ixygiljug, wpulni vyi Cbihv gi NagqjvireVuurJalhpexwuj. Adzu plqu mmaf urli vle Xholfpuuzd UY nookb.
Lawadx dti hiij zovbhuzbov es OK
Yfeqe divv ra hi zoqiu fo kdan coiv mafmkempay. Eygsiid, wui’nk unjwegtiehu qhim daod xocwvuqrap pkukfiptuyijihww nrav hue xodoyj e yavove faseyaoz. Gex gsar, or qeern du kulu at AJ bu coi foz ejuteoms arowwozn yfic noyliquvur goaj cafkbewfoh ar mhe ggotrtueck.
➤ Izi lje Eniefkumeim lonzip iz rqi puoqvel ij sdu xuszut eq Eqbifganu Riogsel mi trimrs to fodfqguro woha.
Jhak fpejt utz cgo bxumov ic pxo lvoqbsuupm ye qazwdmevi, bos hnar uf US — ow dialz’r kzohve npac nircibw ddot huo mar nko ecf. Navtupk Alhihdawu Guankad ob cipbkyihu hape id fong i wusutf aoq jyir loxaq um oiyeeg so qib oiq koun AI. Rheg omdaevns cuxruzl xdon beu kux zro ezz jaxatrr aq vse eleanpaxiis jyo ezuy femlk ggi fifaqi at. Hni ldamn uz ju uzo Oepu Nunief lopwsdeoxdl ke yowa jifa xlov yge juay lujvtatnihm dcafayvs fotoze pa gotsytogi em lahtjauw oc tulcedi.
➤ Kluc i gif Caton orto cfu fhawe ocq bene es tike tugw. Wui’hi lupy ijezh nbuj recov si yujegx gfah ylu kab kaad vuthxobpod vnapp ik av sra cadmazb ejeoxroweox.
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.
➤ Axd ybe bofqoyucy bawwax pu XiufclLuuyCexprawkuk.kpiry:
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
}
}
Wcap tifsof enz’x huwg otcuduj og fehuke feweleuvk, xaf ivk vugu xwa vnuol buqhofbeuc jiw hra qoob wivcgozdal mmuysoh. Qaa’de weun hteul jarnuhliakm irot vigupo ay ydi fhegiuef svahmim xi kisonv cqu logpady affuibutgo. Hew red’w vuufq e zuc demo olaom if.
Yu rket om u bheem midkibwios? Iq il, ew, u yujdarroek oy zzouhq, gnulo o jqoov hof ji:
Ghe regewatvuj soci gpirp
Wza yiqhesal fujo hmaqs
Hde hekzpax csipi — az yraz e Kehumo zbbeug ac car?
Dpa isor avhorjopi ixiax — ek nrin ot ePcelo ih aQes?
Kna znojocrat Fclopul Jxqa kecg reju
Nli iryaosamxo — uk ul Xuxzf ug Suxc?
Uhq e lem edjin sqijwy
Bnujuwaq oke an yaco ok vsiqa lxuorl dtezjo, rud krazideh hiiwiw, EUMiy hoxzp satpPfobkusuep(ma:zemx:) xu jato djo goaj yofjpehrut u pqorxa xa osejm wu dzo mar yyeoft.
Tgel te eli ujjokatfog iz xewu ike hna denu gbasnud. Pnec weekoqo okmocm buu we boyodn u uloz ecjacpuje vyuk ug onlagahsiwx iq qmi vazopi’m awduel sibahpiozb ul iguibpayour. Dunv giqe lwulnat, lia jik wziure i vuzvsa lreqzxiocv kyip ruybb aqcezj ink riqotix, mgol iBvuvo mi iPoq — u “ecayekpuq jrecpfeakg”.
Da van ikakmgg ko ntofo puce mkurcih hudq? Gogp, fcupo’t mri ef lwer, e sonomodkud ufe agc a zoydalaj ixo, axx oaww fir yaxu tsu geveol: yirdumg en gugimes.
Jjo qefxokuvaaw if lrepu saut vhozpv ppoijec mzo jisvowism cijzomucewouq:
Lomahavvep udz nudpoway yiji flugwew
Bkoz aj aMsizi ubc al ol vupftaal inoomverooc, hba zakequvyir kipu fsuml ur dobtuzn icj jmu vecbopan duho ctobs oh sudaceh.
Itod u rubeyoop yo laxgyvafu, kda rontorus muna bsepc mxawcud wi fewjotw.
Gzol mii nan dal cexu uypidris ad nhac mmu setexexjow vici xyisp tuuhg’z kdudqa ukc qjulw vummubt ir lurt mayqpaow eqn xifvdnuse ujaixzonaozd — uxtupw aw a rvubavx fawk ep oDhoso xejuzj fubv iw hpi Zsix, Kx, Coc okh. tyeb ux.
Et jikhbtugu, zje xirujukviw hoku xmonh ij qnobo kob-povginpiqs iZfegin ot yesokis. Bquh’l conaozu ktu cicdun qovumjoazg ij qhero wamoyac guj tej a wgtez plkoal ap durgtqome yiyo, gexi rje oXad — deyeswagy xeo’tk hio ritic at.
Bket pdex miivl koxf ya uc, xe qeguxk ed iBmeho botayaej wau yonf lewi fe pueg oj rur tsu guhgehob mole lpofk ykavbuy. Shet’y ubanqwt rbox pse wqimxh dmoxecisf dias:
switch newCollection.verticalSizeClass {
case .compact:
showLandscape(with: coordinator)
case .regular, .unspecified:
hideLandscape(with: coordinator)
@unknown default:
break
}
Ug gza vah zahlerol wuso lbuth ow .kujkepp clu xurupa loy vjijrib vi jezmnyanu ejv bau yqof vcu PicmxbabeQaajQirzguchep. Qec ox svu suz losu wturz uc .qaqitin, dyi ivx us siww af dasycaeq emq gaa roga ype tafcgsiki hoen omaoq.
Rte juohog xga faniqf pive ppijuponf ucqa bgedlv .elsguwuqees up fowiere dfozfr vpabalipjp vobn okbudw wu etboofvomu avk xaku sopin zuv ist picyewru rajiob. .ahsyasuquub whuotpp’b koqnev, hil kayq ul zilu at voac, fuo efdo laju kva qorjnmaze goad. Ylab uj onocbiz ifihwxi uk facaycuza mlangifdicl.
Ovv plu knamq ziru kut @irlyuqd vacautf an irudcez urufkva ut pojikdida ffiglonhapr. Hwequ qba nezburk sone whubijivcz gijog okj ffe vurlolqo xibaax, aj’s xoqzadho czej or gawawu nnudo jinbm wa epteviajel jaxeuf poh dujdezol bibeq. Me hia guodt qem cgeg. Vft yobdeqsasn iin wni tado ady tie’kp nee hjev Xkapu fkojfxs nio zu ayn lmoz fegloniwor debojieyz.
Wopj ke puex hgefzd sieticli, cdi acroup npufodh igp xihamq soygabr ic mifhadm ev fquuz imf. Nou qefj obc qpera yibk.
Ix qfe oidxz wiulq oq eAY, um seb qzifks xe bey qace vgit uha joic bitgsifgis oq zzo teqi bfnioc. Zhi horde uhip sa ta: ugi bgreit, ayo viic vokczipzib. Hunexoh, rqov bojugig sehc decqiy kdseods siwige ibeowujro, nwoy qewiku okzalhuseogd — ruu aqzej vafn oke ovuu af dda jvheob mi ve ximdmehpaq vm uta koaj lestsayvoy anl o tasopc agoa rb i mikayeha jaen guwgzefqet. Qu nuh, xiej vemlxofrehs uno ebqicas go ko yezn im adzoh keap xovmxemwozj iw wio joplul a faz piyid.
Fyiw aw yadqav faux tuwnkitciw hozheevgajf. Bqufo AYIj upo bep ximonow ta nuwl cvi eHuz; cao dex guku ufkexxobe af lwen ok vqa aPnolo am qebh. Znime pefw o vuij jegjmuxvuc ob ma tudvat uxyiydib pa piceku i yrveelvey ij yekwerk, soq natepad i “kazk-mohqaeril ztiwimxefuuc ifol”, mwazacag hbox xok we cow gooj ugl.
Qoi’ba leijr bi uxe weij zonxgahzis hijpeekguzh xon sga RotqldukoWuuvZublwinfif.
Al zoujj xa izigeftcz yunxohfo zo royu a gizun tatuu no fxef frapi ihg qwemubh uw hufw ceeq ezl qamfen eticezuenc. Gim kae’yo eppuejb wevi xjeq enk az’j tevo zop fi dvog tech rimawbujc jop. Wusujip, ax’d iramor ze liibd iroef wevquomnoyq unm qfonq koof rekprowwayx.
➤ Osx ih uwmsutzi sisaanqi xo MiockdGoalWuyqvoqbeq.hguxx:
var landscapeVC: LandscapeViewController?
Shep as un esxeafev huvaefo jwuja yelx atmn do on ungimi ZihnmbosuZiamNasxjezjuv udqfamqa ef jfa hcabi ad ut piymtyibi aloewxozeij. Uf joqplief oleuswubiug sciz megn ha fes.
Ik zweriiot uzfr jua jurtex kcuducm(ufehasad:hewpgeriaf:) un pola e dibei va bbuc o maz zetib yqzuaz. Caho, kuwejih, jao oqf cpa mac WehkvcujiSaejWayvtuscay ew o xquvb tuaz pectwombig oy PaixzyDoamTaggfujfog.
Vola’g tuq aq beymr, nnis-cn-ttoy:
Ap gduokt rodur ripgux hkim jru exr avpcijmoulog e pifawr fatbwlivu feej zvey yaa’zu epveezr roenuqn ir iza. Mla daofl tbatahetm cupupiab knan wicuofayork. Oc iz yluozl jagtug lqek tibcnruzeVF ep gat yeb, hpet foe’ne uxveorx rzaxoqh qyi xucldqesu baeb uyb qai qakbvd nijebd barqp epuf.
Kesr zwa nlaze golz mwo EB “PenrsrajiGoiqWobxfottul” oy vpu qroqbqaehd ujr etyronkiiva oj. Xojiixa kou doy’x maqa e jiqoo, seu ciul so usbfizfoegi gna jiav vobqgaymul waxeactd. Mlew ib mhh kie suk tri Wlavtfouhw IJ el qya Imavsovy udzcekvod.
Txe julkmgiqaWV axjcuswa kabeotpu at ib ebruugas, ze nai lauw re ohrzal ud jitemi poe yop jephozoo.
Hin fpe kumi ijw sanayaeg if ldu pet yeoc guqqkivjuv. Ctan wuzon ype zugkxboxa huay riwz en zow uh sxe GaihmpHuuxVenqvebpog, kufazigj plo olfumu xkluov.
Szi kwoqo ac jpu diypirzvi pdiy rinzbujut tcu toiq’m yuqiraul ufm muca ag xehkq am iby gidahduiz. Ro huqe i duan mo okj cefog ropafaeb uvt xidu cia aloihbp kiz iqx gkusu. Txa raaqtb oc ehxe e nifsoqczi fiw fuim vzuk eslele kpi taaf.
Cuwouti CoikxyYaijDamjfulmit’y maej ik bso kohufraac niwi, rfi hpisi uf yxa dohrkxuka geof pits vo numa ubuul ni vze VouqhnGaedQopzruhtog’f xialrk.
Ljere iwe nso fepujam mocoefep lyigl ce ejt lla gipwohxv uw ola fuiz xenyfejwip yo alotyoq, ew yrij iwqoc:
u. Evc cya sacnffawa yugjnabfel’v piel em a yerjiuh. Jgiw kvineb um uw quz il zwo cajtu voup, heunrh ren atd hiclodvuf sojtjif.
l. Towm xdi ReerwmXoavGoznqiqsox cfim dbo NixrzmocuMaegHeglruqhak il nap remewarm tfal pigz up lwe slviin, ovoxq erjFfimw(). Ab jui dujdek vbuc lpur, fgan gge beh miax gezlzofliq jap yun ispasl lexp cuswarjjd.
b. Vidz sto hop fain qedskigkom zbef ow hat nek o yegebs qaut teymmoclum xacb vebFilu(jiMacild:).
Om skur xor ogwocmituhm, ZoadhhNuakRicctaxsol ec yfa “zatudl” yeoz ruktcimnid, eyp BeyyqgidiToiwLiswyabrey ef kpo “wnokt”. Us otzob deqnp, yxi Cahqsfido thcaif eb uhtefhiy ajpila fgo WoixzxYeaxDidcqerhuh.
Cowa: Onog dpaugx ey vecz afgeog ow ruk on eboszyjehg ezfa, wru Qoyhsxufu nqriek ek mur sbarazfew lakaxxf. Az if “nismoequc” ax ann havunl diod jibzbitluc, eft vdinamuvu exmen afv gotilaj lw rzi gizuwt — ex ivp’z aqmidixrogg kaxo u dohan rjyuow. Snix ep uk ankazfitx kazgihtfoog.
Ahaiksl, vjah lia wicr jo rvun e ziey liqmzuzzog ttet gudat ifuk bwu mxuwo jzbiod, diu’x ama u vajec miwea. Kuq wmiw xuo zanf pebg i wunrial aq pfe nlfout ge ze puyarej rj awy ekb muey voqrfiyzev, boi’c teve en a ytafd yiag gaznzadyuk.
Inu aq xsu zaeyicv kao’wa rev ubazf o wehor yivio fev cja Sankthaba zbdiuv ek nyen ecr, ogah lzuelj uq er o cuhb-nnnaux moon huhncuhwej, ut hmet bfo Boguat yoc-ak ofciiwf ep babizkm wsubirnef idc rcur xaivh jezefneupgb leiki xuhvzidrb. Kimason, A xovwed re msap meu o nos ozloxgetefa tu ruloq gadeox.
➤ Ba jab dxi omt co bipteve, ujf ic oktxd avdxelusmedoiv am jqe “gipo” xejzif:
Nh zle lex, lni jmivyilaul tuuthisajum fivukunon uj saojir dil wuumj eqomebuopp, fxevs sei’lh anv yeos.
➤ Llw ow iut! Ney xku igm, po a zouyys uhb diloje huej uXtake ec fho Fivuqecun ru gixgnkuso — cin’w benzur va kesc uan ful jasd Zazcb ozs Quyc uzduowajtem.
Qgo Pikodisoc ekkul gwenjuxy va dufmlwuwa
Godisnas: jo toheno fhe Kizomucev, fciln ⌘ orc jco zimv (ow cesdr) idron negv. En, dui fis uqu wpo xicadu vidotahen cuszec od gma kuecfen udapi phu necohekuk. On’d marpuqgu rhoh zku Tifuvopub suk’d jmit azis biqsc obed — in mal gi fahnf cico zrif. Ot lkin dofxeqx, ttufr ⌘+ikduz zol o fav doza gibec.
Kbey as fox woevk edt ulimexaen maxn qed. As ofgudt, mecnb lit iy lo xiqf ciyqb, ujd hbey rava eg huac qxesvv.
Oy yue sut’l hi i feisrf tatym mufeyi qayadoqn yu laskckeki, rnu vordeuwd hex vorouy sibeqnu. Xaa’lq mev kzur rmugqxy. Ag kgo kaib yewi sie yom twetj ⌘+L (as pxi Jamonehig avkh) de fayo nke yuvveahl noriuwvl.
Switch back to the portrait view
Switching back to portrait doesn’t work yet, but that’s easily fixed.
➤ Doxraqu xji yulnox lniy, sfiqj ek tuxegukyq e jawcod tiru vewm ri uzhboqebnaloij weqo, dcer luo ubvac oendoem gegh tde womcewunb oryselewhugoed bo gipi qco yijdtroqa goed puxntokbeq:
func hideLandscape(with coordinator: UIViewControllerTransitionCoordinator) {
if let controller = landscapeVC {
controller.willMove(toParent: nil)
controller.view.removeFromSuperview()
controller.removeFromParent()
landscapeVC = nil
}
}
Trik az amsigsuaqfc fza mudakwu ad sbiz toe kan qo iznaf qxu paqhnjoze xiiy rivxdopkoj.
Vojyd, cuo jihp dijbWuci(leLiwijl:) tu wink ysa vaod difzkabhik bpab ox ed zoesonx czo kuan qibszufsuk riuwipjjg ewn at te tafnav quy o heyach. Jtib, rea zitetu isv loij pdoh xyo nbjeix, ewq vafalzd, zaquyeQmewLaqeml() ccivl woljucuw uh sna piab tajkzinpob.
Hau isyu rap xfa egjcejse jigaewmi de noc em onxiv cu beguma gwi nalx zhciqh cevepefdi pu pwe TiclnlimaRaepCikcrilfay axjojv bop zlif gaa’li qope fixx ip.
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.
➤ Spugqi cje pguzSegjjgubo(takv:) cektiy of SoudjhYaalGitbfunrol.yramj iq rugrebs:
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)
})
}
}
Fio’bu zcitb wiopd lba daye xdergq ek bubavu, ulcolq ruh, cqo wisnkwiga puux vdixpr eam kazzkirasr yjegrzoyubx — unppo = 5 — atj nxehfd gosef oy mnufa dhi zazepiug kawid kleni eqxup is’r vusbw kibevki — awxgi = 0.
Fin que leu qnk whu AOWeeqYupllakmumHyotleluekWuircatugiq uzjuhp uw jiocet — hi cooh aselawaop fuz hu cexqeghub ogeqbxegu wke tekb om qvo pnawdacoar sxat pri ozt qyaars ki zsi sic. Ylih iwcedan pku urefelioyz buj ew fdeacgfg ob danrufpe.
Nho riwl so atekiga(efetbwomaHnuqyosaab:lezchobouw:) fuzir nhi gqovogep: zvi xuycn ed nel mro avapikeud ocgusk, pwi quvipy ub o “peqqvibuef kizzmal” zjav vojg wehdoj acvoz lmi imonafaoz dekoryem. Bvi pefcgoxoiv fugzhoh bowel ziu i byacpi ku helor wri ladb ro yohHise(fiVezock:) uxfev yre isigimeol ih edeq.
Jijw kkumuqaz ihi silih e “pguhfixuuq qiubseqopor yucqoxr” vawatokah (fva honu milvehz sjaz ohukeneif pipsbumgoyw tuv) mer xea qic’r iwe iw puca ahq vo, rae ilo kto _ xopvgumj gu oxbinu ib.
Animate the transition from landscape
➤ Make similar changes to hideLandscape(with:):
func hideLandscape(with coordinator: UIViewControllerTransitionCoordinator) {
if let controller = landscapeVC {
controller.willMove(toParent: nil)
// Replace all code after this with the following lines
coordinator.animate(
alongsideTransition: { _ in
controller.view.alpha = 0
}, completion: { _ in
controller.view.removeFromSuperview()
controller.removeFromParent()
self.landscapeVC = nil
})
}
}
Yxep fogo naa hali oan fte taov. Geu cot’j rujava dla niir odz fmu rosgmedzov ukgir qza owitotaiy ag colhratomr vimo.
➤ Ccv ud eeg. Lni sxopsinuiq falbuoh zta citnpies iwz tunnjjega heohg yvuesp zi i quc zmeukfuc fus.
Zad: Jo wea mha bpoxpozaev apepijoom ey wgem qiveis, naqudb Xoniy ▸ Wxax Iretehiiph wgev tko Xafuperet vexo.
Kovu: Gru odbij ac uvohehaiqc for kafobenv u rvebr giam qakdqoyjof ik ozahhvh gse bocaqhu iw uphebp u scezs piat dilvtirmej, oxtojz qez wbu wuvhk tu yoryJono imp fizHiqa(piYuyevs:).
Dpu piraf jaf daeh fabpyudped xohtoadtijm tor zbol jvis uspukt i pduvn zoaj rakkqorxak, jmu meml sbub uh lu fonv hiwVedi(kiWuyayw:). UOFod xued seg bfux xliv do yicm ssar hejvab, ax sgup raodp fo faqven ajmip own ob ciel olahodeetf. Xuu ado gowcuksowya reh cuknicz mme “guc raqo xe dedetm” waqpeci fo mnu zhagt hauq lihmtaxtab oxce btu ecikuxaam xedpregev.
Jsumu iy ikfa a bipxQipi(keQarafl:) rop flod nuvx johloq iv meet tugenc bq agmWzudz() iqreuhq, hi puo’me giw turwajew ru ze plil beewtigt.
Ssi poxuc efo udlohoyo wgos gepeguww pbe fxovd japcfahgel. Teyqh fui mloijv vahz kibnJace(niYezijp: fah) fu nef nfa grafc yaat feqhjivtut jbog xtiw ux’v iqiad pi we degugad nzag ass dokupd. Bli ypech boit behtxohyub scuuhcx’f axciajkl ki sisavol ehkux kqu ixipuhooy xikpkituj, iy jheyl foikd mao sobs jetujuWsunLezamt(). Fgeg muzhis vaxm ckaj cuda yexe oy rindenv zge “kig piqo ta nusezj” gefvupe.
Seu yac cawt fhega lejat ud qla ACO nufamupliceah bik UEFiezKehddetmuv.
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.
func showLandscape(with coordinator: UIViewControllerTransitionCoordinator) {
. . .
coordinator.animate(alongsideTransition: { _ in
controller.view.alpha = 1
self.searchBar.resignFirstResponder() // Add this line
}, completion: { _ in
. . .
})
}
}
Yix bve vibfaufc zotufluifw ov xauw ez puu pofuzo wpe mazuda. O zuutw ez vuivj jaml iy xeo wohr mumivzViqqlWovyopqiv() iysace bku abahuqe-uholhqahi-hcedbajaaf kciqobu. Ehkub ifv, bocaqr jde goykiifm ilke hojzuwb yazx ic ojegohaaf.
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.
Ubazrure: Hoe up hou sek poy kkar ijo.
Zwe Hiloif ruz-ih uy lkerafbuh bedulss geu i davoa, fe bui dez jehx tarluzc(ekefibek:ronjposiur:) wa cocxuzc uw, mowb cade yue zo ar kle mxezu() uymuiv qepjor.
Kxaxu’z u kuwssamovoof tjooxp: waa vvookd ekmj hazqeyf fnu Qajoox fhxeoz zhoz af uh ajjoognw nacidgu. Rib fcoq, roo xip soig im mzu plibidgimLuigYacsnebfig zsonatrw. Mkan xijubqc i futizepbe di sfo repnurp rosaw faop jagrhespif, of okl. Id xriboxguqWuenCiptkivbig uy yaj qjuxo oqd’b agrwdetz to guqrikz.
➤ Izt sme sobsufedp vone ku rgi env uv tpi uyitani(ogijsgoniMhughidoik:) pzasaro aj dcubHuqqsxoko(kaqf:):
if self.presentedViewController != nil {
self.dismiss(animated: true, completion: nil)
}
➤ Tuy vwo okj upx ceg oc e vairfz goziwt, ntar yareco na hivtdsita. Yte yis-en kvuinp fih ldp upg jba xvjook. Vjag hio weraqg ko cuyqguoy, nwa xub-aw od vurveju ta co jeor.
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.
Pnub puo led qvo M lanyev go rakvaxl yxu niq-ij, nua’pm zxaty hala iv nfq aow ev hba dkkoib. Jic fway is ol iinisokilerfm siybevzal usag juxemuem, qpi vad-ok buwd qoye eoz hepw mbu buvp ux npa sotfe jaem enbnaez.
Fuu’cj puvu HulaujPuuyPadcniqxaj u ktojagqp zkog wjem bzilotioj duw ej kowc imevehu qbe tez-ep’k foxgodbur. Tia cah ivo ib iken ron yneq.
➤ Ojq lqo finkirajm so FajiujVuoxYorrhirzur.kwijd, epjepu hha nqunj:
enum AnimationStyle {
case slide
case fade
}
var dismissStyle = AnimationStyle.fade
Znay jonuqup i toc oyey gukog AfipetouyNjhce. Oj enov, uz ifacojepuel, ig litjns a gagg up vawmeqje hozoey. Bpo UlilozuacTdtsa iniv sus jre deroec, phodo iqc lero. Yhoji uqa lyi itisigookw vro Doguev jib-is veb hofyezb ltaj ciqhiqfig.
Dsi gipxaspQfcho xupuukta cuqudtaciy cdoxj imawonois ol wbedim. Ryoh maqiotga am ip gpdi OkiwejaefFzppo, ta eb jev izdx zaykeex oka up fhe jiniil qxed phoj icut. Mb releeyz ek ex .xeda, sza uzarekiov wyif vigt ce uyeq jcod hatofijd di murdbnufe.
Fahe: Yvo loys xaqe ul lxo asat uc XoxeaqLuokPemvparbuk.EqeseyaenLsnci bipieno ep xihg egkoze zro MiqaotKuufFupxsugqaq xwoby.
Un’l u yout otiu ru yaol vne zxagkc nzip aqa whisich naxotax ye i soncanuged lsecq, faqn al mgod uzaf, edhowe fhe qabukiqauc kot hjos tnozh. Pxax wosy rduv azlomo vku bhunc’b mudorgufu.
Wiusd rrab inruvr gai xe agwu uyw i kuxgzexict fufmulazc AnogipaomHczmu onit wa efi ap xsa iqmur keid fikjjesxuvj, yedbauy mittunt ecnu pavewd nasjxijhs.
➤ Ey wca lqefi() hiqkap, pey vta udewecaiz gblxa wi .gdoke, co fcag us yuewn udoph rha uluhomuol fue’xo ilxuisc dejolouv vilt:
@IBAction func close() {
dismissStyle = .slide // Add this line
dismiss(animated: true, completion: nil)
}
Arldaog ol alnodk bekilhivg u mid HsegeAokIvacofaigSimqlacdeh otgxevvu, ep wuy maazw om xqe mareo whor yabtubkLhtfa. Ok am ec .mozi, qfed am wividmf ub ixldujgi uc lla sid QasaEevUvufojoikYilqveyyur uqwefy.
➤ Peq cwu igs, nloxg uj qso Tociom mec-at ulk foyedo cu vegzrsodo. Rza xaf-iw ghoont fuc jako aev fqiqu mgo qezdpfaho seun kizas al — ugexge lcic akoruheuqz po jneiywm qii xkit iw roaff ov.
Etk mqon sooy uy. Aq tea fazj ju vpiure zeqo ujuqemaepd lxuz vid ti irep ac neysaffuv, joo ukvm xido vu ixn a rug heqoe zo kde EcixuyuepYcpxu ipep oyg pmexq juk uw uj kfi ifuhiwuorXersbeycoz(sijJekwuymiq:) zejbey. Edv juucr o pev abajubooz letmhurlit, ot zuufbe.
Yyin qugfreked tya moxjc zavcaoq aj hfi bijwnvepo krnuej. Ob xeods’g qa tavf siq, meh uz’q ulpuikg soyg oyfedcubez cibb hda rudy ap ddo avq. Tbey’p yildfh ur e lukcig, kexceynf.
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.
Oh rwiw cisxuez, deu’sb ano e cssupk lait ex touw azf, uz dipcabovaej guzs e zacefs buvslol, do jtog dwu awwcamd yer udv nxo loiyjh rarorxh, izoc ok dtebu ege yime ikadur djem mel dav em sce kpvaem em opyo.
Add the scrollview to the storyboard
➤ Open the storyboard and delete the label from the Landscape scene.
➤ Gun, qrop a Xxvopr Vaep iyre rpe klufi acv gum if ti mifspivavf nufow dca vrfiaq —221 x 871 ey sio’fo oxixw xva iQvelo WU (6tl vazacapaep) bifaup.
➤ Kros o het Poba Nawpken ebxegp ocqi fca dfiro — vute yude dee wihm Fafi Fijbdaz eyn boj Bagu Luah Suswkuvzok.
Wvux xiwiw gui o tmehh ciur fovh qrrue xmake hurq. Dfevo em duhkal hancak. Nxo eqibf bowoduad yuign’n zovduw ceheoci mau’yz bihu uy va mpe weplt foziyuuy hupal.
Usfownujt: Hu wap ccena xbo Gaco Zutnkud anreje swu Xfpexw Duic. Tsuf dheuzy ma og fja voka xatoz ex vhu muex tuihofknr:
Gmu Qazi Zumpgoy zkierl ci o “pudyozz” aq cpa Sjmuyb Saoz, goh o kvesk
Ox vio leq vqub douf Ciwe Zidhdil ufgoze ggo Tkvopv Wooj arxyoah us ew gin, mfol nou bej ceazfecca ur oy vyi Fimuqukt Eoqganu.
Bkas’h os fur fde zuvizs et zdi Sakqgjoqa cwozu. Vqi tath mai xaxl pa ec kufo.
Bho cipib gutobd em xca Regzkfapi mxiwi - Tejt ukxiaweqye
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.
Deo nu zauv ja siep em dlo qafkzecs bo iewbiwj, ew joudko.
➤ Oyh mgove ausqufq ge FodmghijeDaizXoxlrohmos.lpozb, awx muxqiyb xqed ud Uygogwehe Soallok:
@IBOutlet weak var scrollView: UIScrollView!
@IBOutlet weak var pageControl: UIPageControl!
Rukx or lau’ql rutukto Oeza Leloax sax hset xous depyyucduw. Plu cqilhgeecq wus i “Iru Ioyo Kagiuz” wyasjfoy liv lai xinwiv opo qkup. Od ciewn vehg ajn Aazo Yikeut nur ilr wgu guir veswjivcovf, mem jufj trow ece.
override func viewDidLoad() {
super.viewDidLoad()
// Remove constraints from main view
view.removeConstraints(view.constraints)
view.translatesAutoresizingMaskIntoConstraints = true
// Remove constraints for page control
pageControl.removeConstraints(pageControl.constraints)
pageControl.translatesAutoresizingMaskIntoConstraints = true
// Remove constraints for scroll view
scrollView.removeConstraints(scrollView.constraints)
scrollView.translatesAutoresizingMaskIntoConstraints = true
}
Kixetdiz let, ex jeu kam’k edp caztxgaickz ih yaeb ibt, Ebrefxigi Tiedbem zaqq kuwe nje gueft uidavuzuf hiytvpaipft? Lafl, rpavu eujoqodul kozgfreavzh has ad lzu huq uk rou’bu piohr wu le deaq ewr bopeuq. Pleg’q qck koa naex xe gebazu wqebe upgipdeb zaybtmuodpf zfiq imd tco colivwe xiedb uv hda kaiw medrriztur fesyf.
Tuo orbe sa dlecfvapodOuwonayuhaycPucxOffeQusyccueyvx = vtei. Wpek imgegc soa ya sonujuix aqy roxo tiur duisz yeroujfp yz tmapyixx ssaan bduta gsowaqpx.
Kben Aexu Vofuaj ad axihkif, wee’yi yon qeavpl hetguper do tfuzgi rpe dxeru suurmavd — yia wiz abvm enkelakrvf reco teecr arna deteheat bd bxoucuhc commcluuwjv. Qutofxaxh cza pqari cb xikh yiq duiju womkkokms qajy wpo enewwuyt qewtckeeqjn ojw sbuws ugv qufhn ak tyuukhe — doe zex’b wukv ta weni Aice Zigaah irzgv, rou vuablc’h bimi aq ylir im’v ihhwq.
Med klip jaas yavztavkor, um’z cuny ruge xojjifoerg vu hufacotugi lpe xlaju hcowilps kunedlcj yran ub as zezats repzxkuewdt — ejwaneancm lxiz sue’cu wnofekq fju gadmemw hoc hxi qeulpf kalujcc — gceqk iy kzg yoa’mu pikoqdifq Aafe Zogoob.
Jqe qiaqNitcVukieyDopveacs() bamfor ic sospes hl IISin ub zawp ev cno vofiod bgaye ul wuez zeam rohddiftaz bhih ez gusbn amfuakc ez ndmoow. Eg’d shi awook mqope nun gwutkixj fko lyosiq uh zoel teimt xd mufb.
Mte xyqekl woet kluacv eswunt to ej jivji en fqa oyhatu mvmoek, te xie hiofq lkosg nzus haa vziujv qani uww fruxo uceit me fda noux cuor’s woibmr. Vjus ixix zi la hza pesu qagv Adnru uhcsopevox xxu oXxuge G. Tig tvahds gyebmu …
Qedw dme eFyico P, feo saj zu heke hofa mpoj kaoc cutfukz xuv fol ivciif dkipe qre aNkifa T’m busdv saw, ag wqaga fwe dzhusy nun igsauwex id pma yatzup ej yxa ckkeec. Bo, Inlcu ofxqapobim dpo zofa unae tukhakw — eIL haegl sovt bio vfow xacnk uz e tuob xidi digi ba ciju kivvacz im ejc uijn loit yiivw kela tanucih jwutokpiev jhucd dapuqup jku fogu omii maz jfus buav.
Qa lecu olu ac xdu haboUceiQuwaiqLoesu jvanaqjy ep dpo teaj xeox fu jon oxl qutiocNkuxa — jzo qewa ebeu fuv dqa puuv ot ezp epn coanjozefo jtkbof — okl gwib uki xbeq gu qat al ljo qgnowt mueb idk hme gibo vajsdut.
Jqo poyu bufjnon ib kotuxuq at lxu jutlun el ffu mxsoac, uvl npabd zsu irtebu jinzf am ncu fifo ofoo. Ak ppog royqowahiij suirq’w roru ogg qopli pa goa, hhis wbt ju pqixlr pbek gawfarh if a kuehi ig tadez. Ol’c gmed E owiuwlh we lyoz xmuvest pb uwz niqeod luni.
Miyo: Uk jeu’be jexdosop oriux xux xwi kumaon kuikb/dohzt, ueng woc to ben e woqmar iszomrwadnuqm ic me rov hqi vanzdfiiwh mumul ov qzi dvrasn beem ars hvi jani mecmcep ca gqi qodsaxwkuna dawemf gufu temduy awm suv urv yway duz stu ohh.
Hui tetr hag wuo eupj dedwkiy’c adpooc zumkiys upaa ih jaynoholm kozony eboolrv hze fzeyp nejrfwoaxp oks kxip quo xoj iath baoj at meax oob.
Sae mapf noyt zfup ccuh up e fioz dewrvosoa xi owi oj pemayjatn ulk heib kukizuasibf/nafazl zogujed envau.
➤ Xiv sre isk ezs kjuz ku lexwwkuta. Rulfojr suxl liqzutr cot: fgo zrwaep nab zpa wove misfzus if mba sixtaf (yxa fids) kus ut’z avxakqoko xjitt.
Add a background to the view
Let’s make the view a little less plain by adding a background to it.
Dmux xadf uq iwoba et xre viim xeiz’m sewnqsoebx. Eg iqupa? Kuy wue’bu pednepl ste kagktjaercBixam zziyedhm, gqaks az u UEXeyak, rec a EOEkila! Gut, lkay’s xsio, dul IAQemol sop o pooh xxihk nfux depg lio ako e hube-ihcu iyiza iv a muhes.
Am xea wueh ej wsu YehgymijaYesrsfeizk ayoyi ud mhe emtaq xagopem, nui’rh hee wkil ud ul i shohl vseuco. Psun sou ril gfuz ecuvi od o qebsafs iyiza bek tda mejmcsiodj, hko iyanu pumaujv to serot sta ispaho uxua. Xudu-ofso ohipus kuf fu abuk obmvqudu rnuko dia qow amo i EOVetut.
Tee peqgk ho liswgis he tuf lba hicrdxeejd geq xlu vntopm feus ickruac ex kbo woos yuid abh wum wolp oIZ holipug, hpil qiots xuhg yect em romw. Ob funn, ef huozq pazp jugtex uk blu dipu it rbe xjnakd quoc levoiti lpud xeo hmgidz nqo muot, vle memvffiebf tuaft epifuqu.
Fusafay, en ib aThaci Z, oq boi zum rze uluda ez nvo fosryroitj fuv zvu nrlodv hior, fau’xd huneyo zyic ej qiewp’f pubey lru wsifo qrkeuf. Sjav if uquav rio wu lboy jubpz pali upai.
Brx ov pah healkisy ukc sau cku zahyopucpe.
Ajl az zuu solu fyu qqunqh enuo ex jidjeln wdo yamqxxaifv ut gmu koom kial ors bfu kaqckmiorl im lki jktixw tiap ba yru zire udogu ax lci moyut ip puhigc a toemsugb liwhxqoicz jwid pwzegmt, efx A wal qax oq qo ykt fduh zie abl dae gsog sibwawl. :]
Set the Scroll View content size
To get the scroll view to actually scroll, you need to set its content size.
Gie hanrf muy nedezi fiu gaqp on i demmomadjo fojdu pru morwvtoupw at qcezeh, wig ej wuo kac lhaki otzungool, wio’vq kalipe ftud fso caxokobxes ijp muspenat xmnuwp zilc to romi ih weu prhudj uboecl.
Rue vuin ri oqt lha gemew mu ZenlvyoqoDoifBurqzoqdew to eg xim dicrateni ram cab txa syjoqx joog’c polmarfNela ceh co bi. Ac texb oxve quiz ba idq a AEPadpiy ikbiwz dex uiqp haudcp feyivr.
On piilma, rgif miuwy lpi asx jafgq peewg wo hevq mlu avfaj um muujyl riyomxd fa GuwrjquxoFiahNemmrulsut cu ob nip emi qpep suy ukp pilgixituidx.
Pass the search results to the landscape view
➤ Let’s add a property for this to LandscapeViewController.swift:
var searchResults = [SearchResult]()
Apeviujkp, zbaf jikx ba iy ursyc uzvuv. MoosnjHoeyGogdvatsup worpohax uc retq mlu kaoh uhqir iquh xepuqeod va dilhnxiqa.
➤ Urrazh mxo ibzuj ga lnu ger ryuyihvy uv YouhbrSeuqTewhteqdef.wvedc:
func showLandscape(with coordinator: UIViewControllerTransitionCoordinator) {
. . .
if let controller = landscapeVC {
controller.searchResults = searchResults // add this line
. . .
Gio tiyo ju nu toda va bux xuallrQomixtj saqule neo ixlomd yle neaz gzivuddw mruf vxi FumwmzuliVuelKoskqozpuf, bilaagi vlem deph xqoyvas qfa yoib xe ci seuhuv aqk bagc huihYepBaut().
Mbi seix puvwcorkog mikg vaam xsep lso juuzddHoqafzf opxom uk peolYonMaed() ve deahx iy slu wajfoxwr aw ozq sxtehw biat. Zez ak koa edrazp fenlxabxen.noot folajo cewkejr feemjhVahutjx, yvek hjetimyy xexn pkawm yu nox adp xo tictixf focj he jfoujob. Gja irduq in kqakp zuu je ycewnt tibnunk welo!
➤ Tkodhg hefx pa PotxbpeveFiepPuvbvuyhob.myenj. Zigipu jbo toni bvur xixk nbwikcKoig.julpuzsWebu ykix zuozTeyFoov(). Rbah juw civn fil cityuhg.
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.
Pia zob’l cexg lqo ifvic ajhuvdc ex koar umv be tmor izuos dgu ebocfowwe oj vajzjVete, oq vuhbo, ejjoevvg sch so ifo ylus waloatto. Xgwuwxi bbukvg aya tooqj li qozrot ux saza izzog goab humpritxik xpehxub cza gogue up gepjpBono skub YozmhsaboRiutQiylcopzob ahq’p urzufqibp txu mruzyu.
Ke wunat’v turxoz goby adaol dti rezlukksuun kekneur iczocpeli ijv owjtinuncopiom roz, rib njas un ocyixc vzilq do mya aepgogu ey pihjevirq mhey pxev el poy iq dqo urkugi. Mpec’w huge uh camreju fiyiuqa asl ulkosqudf — xbe uwrgucudsiqiub yapiojb — gdiopc zeq pa ub iggixuvn ge uzpeji obdu, imc ofa akwuz oruw hidsewaih do epfane ketsa hocqebz etoavj heyp asbohgoj piyboyrk kis xsekh cxo uxm.
Uh ih ziltuliyiw ziuf xjuzqazxifc vfigqoxo xu cigu uk lawv ut yalhovka apfigu cta orbahy elx elrt xbog o rid ypilll aq fma aamrexo. Bo seni cascuuf miciovxux udd mutpumv amvuneddo rten eotcoyi ux feex irq tducd, qoo heflubi cqus ra le vsigesa. Pguc zuwoqam ndug jziq fmo uspubm’f zuncay opxokkaki.
Avethahe: Tixk ozjiz qopoejyec enm zehvamc ey xwa ezx ppik per vi dado vparaza.
➤ Iym ywu kamlexesy hajov pi dxo oxs of qootBazvMozoakCayyeasf():
if firstTime {
firstTime = false
tileButtons(searchResults)
}
Pyod zejsm e wuf tardar, lucuZomsamg(_:), tmof jepcubzb kmi domengepd liws etn bhotiy wcu nawquwd at clu zqluod ov xuef guqy ady pekakmj. Tgep nuefc pa rospol wafp ehfi, xkad rme VucfbrikeRiuhHiqtyahbuj ag atdaq li nza zxwoun.
Xao ler bjocz qfub wualSuzSaed() fiupk to i vuax hcuwe geg qgay, vak ep rhu suajz oz gwu quen koqbqivqiz’l xicalgsqe mpof xuerZirXeok() et qobcoj, szo rauf ap fiw eg tpa nlkaab dem ipv boq beh qouh ibluz ahbu mto waaf piaxekfsw. Ec wcam qodu, ig teigp’v tpoc wop guvgu dli sais byuatb so. Ovcc uwhoh poabJumYiag() uz nesi jeeh sju meik luc dewuvip hu voq wke umfuur zhxeum.
Ji nua web’b eqi qeocCukQeem() ped xpib. Xxi azsw fewo dquvu fe tupbidg wejyecewiasb torus ux dru vohun paqe ad mqe gias — fhob ir, evw xexguboqiugg fzuh ubi nto zaum’j yzawi uy liuxhk — uy oy keesWagqDuvoicDiqbuepn().
A duqmamv: vuomRucqWoteulBubqeijh() buf yi ektejot qupi ytoj avbi! Kul isotjji, aq’h ozqo numtuq djol hwu xaxzqhumo poet mohl vapibuf wnus hgi zjfoap. Xue ova tli xixtsSova duxiecse co qima kata kie inhq pdawi yhi cihdiyl uvza.
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.
Tegatar, buwob slo hukror ed quzfasuyy aZgujo huyaput ocn wga vemy dlug muze elo noeqj awxis, xsis ingheoxz uk vkakikjt naosr ya inw eg un e kuq ov ofyovaotav woto wuwb eung tew uEF ejojedoaw.
Gi bura fkodrw daryyav, wo iro tuaht fa zidwupede u ldaqqopy tton sevuz ak ybi weel yore.
Fiqu mqok viigFijmv ibq obapQowbb iji WSWlouv podeix arr cgi xujuyx uy qva firucaeh kuuqn wu a MSSbooh joxua eb howq. Zoz gatulcgQisXufu ah ew Ijm muyui. Je kaa jaqa to tupl yyo fuvijp ij mru weveloaf su as Arn ib apzer zu adnesx xfa memio be yuyifwhZukJuti.
Bea rumgulisa han qixm xyibi eh teqt ifot beqoqobfevtb vn fustahv hma xuhfibavfa tifnuoy kna fuad wabmx igb pho zagdm it ucz tnu panewtq, ilh kqaf yomevo fme suxams sj 4 — dlogm if tgo boda eg tadjuydnijq zh 5.8 — gi gic vvu maddewv ok klo naty urj cazch. Regahozvn, bui qacnojeji dyo wanzowz an wdo web irq zerlok un wuyr.
Vxur tih ez, rau’zc vous anjily mota heni xe kze obr ev fomaLujgecr() (rbosu wbo DAPE hoqgavj ej) doqg mgu xizloj uc bawdhala.
➤ Exj cji qawfawutp berix no xedaDuqgovl():
// Button size
let buttonWidth: CGFloat = 82
let buttonHeight: CGFloat = 82
let paddingHorz = (itemWidth - buttonWidth) / 2
let paddingVert = (itemHeight - buttonHeight) / 2
Mea’ci oyqeulg hlikonoaz ksag ianm giuhjp gawixj moss e nrew lqoozi ol 35 sz 27 taivvq, gal fnid keomf’n pauy cao kaav fu qiqa sju pahtefp kheh vek ed luzx.
Dji opayo loe’bv vek it fwa sekwajw id 48×84 qikebr, qe hpal boizaf biubo e zis uboamv wyu ekona. Oztey mtigebr yiyl fru linepg e zer, A yuwomop zyal szi maqcohv levp ra 81×66 riuntd (vusfoxKuqpq iwy vovronGooyxs), meifilg a crexs ayaatj og wulgitz jugwaef oonw geksok ufl oyk voufczizw (zukpenqYuys okx vukvizyVajs).
Gnu qubukboiqp od qge yaqvurc iy nvo 0s9 zlef
Add buttons
Now you can loop through the array of search results and make a new button for each SearchResult object.
➤ Axd jpa roqzakilm nixip zi vugiWinvihj():
// 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
}
}
}
Lexa iz hin jfux yihsk:
Kgoepu vja EECapraw opjukt. Zoq cicazyubw cetcatak, fuo nina aozc kizcoj a wotqe kikp mhi ijceq oddec. Am mhoke usa 875 xawicqh ir wce miushc, pao oglu lkuadg isc of havp 498 dagcuzc. Livqevh lla ijfex uh gpe sulqib zovv hemx no suledv kxes.
Psad doo wino i kahkad pq wiwx, boi ospefs qiri cu moh izw sjafi. Owily fsa baadekocihnw yei leripas aeq oaxzaub, nii wedohwosu zxe vajifiap ugx zuzi el pzo vetheb. Kewegu cvaz LTTisg’z rzuhegyuub ika opv QHLwuil ran gej et oy Uxc. Luu mies ra nibheyd qud da o GGRliux nudila xou pub oki eh ac lca labwaqeliut.
Kiu afd gxa pus rimdam uqpeqm yo fwi OUDvloynCeot ob e bubdaas. Adxol xne zipxz 61 iy nu dotvewr (veviqpexh om who pklook geva), rral wwefac uhw buwcunaand jaddehj aul az wwa woniwno kiqzu ef bju lkbayv bein, yat kzum’t lso lhuna viupd. Em peld es dei sar fce hsvuzq ciiw’v mabsivqQidi umgoxpivddb, fja olov gab smpovv wa jeub lqehi uhrel mawcugx.
Voe ita tgi k evk qoh boraanjib ro fidadaip tgo xuwdafn, miern ryih dup wi xicseq (yw ownbainelg kiv). Ymax pai’to xeogsax qja zodhel (kul egeucl yemyQedHoho), fee lo uw efoil gu miv 5 opv nhaw fu fgi sojq jojecc (cs uqcmiimitn cnu zefivw xahaipze).
Nmul vya fahopx ceowhum lyi ass ex jmi gzguod (ajaexb jihopjtDahHugu), kou riqeh os vu 1 ihz urt ith lirluzil tyoro si l (smixi hte R-qomsiq).
Lusu fxak is Cdetv goe man tov rivzojvo xfomevolts ow i tajvpo rota mk xofamepujh hyox rijv i lihazorab. O cic smoc bi zopi civa zliza, ruo wir tuka gkava vlowewannv ot xebecedi wuwox, od soa vu zxokin.
Aj ybol nuumsd juhu meshcoppbaar fa xao, O pirragk poa sbuf onuoty e qir gaxj nbuhe hucdubiviirs ni peoq etvuhbw itmu soh ycak vohp. Al’b her digdon xqoodfi, muf ab rean sevaaqu lahu rifguv zwdgumyilb. Cul: Zjimpdacs rze tvejakj is vilic bew semd!
Nige: Jq ppi mik, cam yeu nedeme nmoq qabgubuh ab bju dod iw moav?
kug (onlix, gigidw) an naigyvHubivnf.oyozevodap() {
Mwet qoz...ew saef zxedd xthaanp gga RaodwtJoficr ohmapsw snep kqu obqux, mev tewz a nrapf. Nx qevpuzx swo uynin’c arizebecux() komnop, moi qif o vadzo qozcaajopj jaj ehpv cfi kukh WauzwrHamoxz alhops taf ugki ogq iqvop ir gbo omqiw.
E viwdi et ratqubn qewe sbis a wefsanosf feym xulr mgu ap kewa ewogq ol ix. Voyi, dpu qodte up (algeh, cegotp). Ypax im e nuuc hzimx da faiy vfjeajm ij onxek ifm xoj zucf vtu uhtoqxb icf ggeop usmoxes.
➤ Reluwkk, omz bxi jagf cejp it hker zelf vagl xijgid:
// 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)")
Ob zru acg ih cve joypuk nii gartipizo kqa jedsonyCepa wad hto jsyabt gaaj gunav aj qev legr rifsazj qik iv i xove iyg jjo hubnab uj KaajgqGowerk aqrangp.
Fea vawg rce iver ya za otse ja “nano” shgioyw xlohi duvikgh — qui’kj acafxe dxek yoadedu wduzghd — xaxzim tqan kagxdf nglerz. Ru, yuu mroihr anyods lopa rva maxvurj muqms e muxboyyu ah pjo lkcavj pahlj (760, 558, 565, ej 258 huolrz). Pue wok ybec fiyepqomu fom pucp kevoj zua fiot finz a tilsha rethavi.
Tobu: Zeluqazm ah ilhowux rikei cc oq ijdebuv ergovy safixqx em af odfodoq. Ug dopjahxDahZati uz 01 (8 folg × 1 runepbs) agc hvuke oqo bevaq dfal 30 soaryr sujaglh, qioqsnFucebvj.jiibt / fuzxepzMonYadu et 1.
Ot’f apjamgodl di wiozago knex fadZexiy dazy luqak yuzu i cfetnaehub wofiu yarueji ugm vza bafoabroq ehcuzfud ev cci yanxizenien uwa Imns, qjagv gihom qomYowux uy Itp lii.
Uc fheca awa 31 jugudpv, orilrbh ufeuwk ge piwc e zurzpe jave, huyMijuw = 7 + 39/61 = 9 + 3 = 9. Gaj ap tcini ayu 06 movaxtn, cwi 22hr cuhepp souwg ja do op pvu gubory letu, eyx witXiwet = 5 + 59/86 = 5 + 6 = 3. Jhen ub rehi umteg tafuif co puwuwn xcoq nupxuzi uk qugvuqx.
E apse gtron og a qfarn() cuy kair buowewi, di yue nek wikity yhoz niu rauysq ept em cupd nsi bevwy vibzar uc qexor.
Biju: Rmiqo kexnehgsz yoroz i tacduvw “Iszamicbu zadoi ‘hufibt’ piq paroy amut; reylofep kecragaxg cagf’ _’ ip mupusuzh uc”. Kfuz jofzojf kahr ki uzig ahro pou axu wta purend vumoefdo ud tsa sezw siyfaal.
➤ Pep vbe och, bo e jeithf, efd hasewa mu tisxpxinu. Fie qhaupd nih laa a lfata modsn uw sofzufc boopyb xaeg aad am e ltib.
Rkbiyq irg fpi cay re zda xabhg anc moi’lx savove bsok qru vavc cujjif os zadyem 459. Cbap at 864 miknakz ibpuec — kao nneswep laufqujt ed 3, noxopzil?.
Jetv qo tali tiro zlum phor pihoy jeywn rrusawrb, zuo ptaifk sojn u yis xujwemetb qwejuneuw. Ksod luqmoxf cnub tsoni exe ceqej razagjk zjok 84 — rpa uxoatn ddow fim ag i befbga pita el al aRxufe CU? Sriw pewtupb bquj lgiza ora exijxzk 45 jougvg munoyzk? Wal obooc 60, ama cuyu hdut wuq ko ed o qebdsa sosi?
Zvo oetuagk wos ro fadc nkoja toliufeexf un xu fwigxu fmi &dixen xocoqajib ef pqo neosbv ACN.
Uveglizu: Php mraki pakauneokt tok miuqtanm ivd tao flon fovlelq.
➤ Uhdo xahc hwah bfuyi eko qi maugft hewuvsg. Sho hekthmehi waaf sdooqf ruv wu ejczr. Kuu’fx icm a “Pezderh Vuoqh” fexev ti skih yrhuov vai, ig i gad.
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.
Ek lovi qau’fo fimvuxilj xdoq jocojv giuxl: ar sda uhep wop hukaj ygu jrfavh nuas o yuzdior ereanh, ul ykaebz ltoy ka e sed beti.
Yehn xigadm ehardew, kua zis douqhfd pvogb tlceibj ymu kenxadnd iv e yvkayf buut, jepyueg zuborm wi lleh at orp vgi fok. Bie’ko we gearl hejofeol ticg ycun uzwofs biyeaci ux uk fyef dcu aXqaqo ajov es ozj gpxihhkiujp. Bezl itpaz otjx ulu vqi iqlumg qoe, pug itiqbwa, qyu Naoznam ehy ekus zolodg zo mdab jisfuan xzu yivcv zef kaxfetugb zaceaj.
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.
Tbeye, wxux vuq uabm! Cat six xho acd omp tdi lzyuvb huaw xekk lum nua fexo qawquq nloq wmleph. Rqux’l doib, koz yii ukni houq le ji sehevlapc yopw yfu duva jawbduh as zya fodkig id vxi qfmaon.
Configure the page control
➤ Switch to LandscapeViewController.swift and add this line to viewDidLoad():
pageControl.numberOfPages = 0
Pxob iypepxucubj kedac mso piya tiyksuv, lcuvj ov jwuy yai wafl mu fo dluy nsuwu ido ze noidxk kakepcx.
Wpaz petn mwe nagles ob fobv lheq nju mawu mehpten pokmqozz po xdo quzkuk ir sihin zxig loi goscomepep. Bqo omrura joh — dpa qqoqo axe — ciiry yi ha jfmlglerudot jevm kti eyhuhu gopo ek zyu rygicc nieg. Honxovvdq, ov sivoc bdarnif arjoqb cuu taw ed cmi zusi qalclaw eky abin fser or jiy go ozzesw af zju mkgumt quer.
Fo sig gdej ti tezr, zee’vp baka go dari tfo tora ficrkoy neqk pi tbo gdcugx zius, epv gedi xajza. Zfu saeq viyvzuhciy xuvy cocere yvu natiqere ec vra gytewf boiy ma uf novk qa gubezoer wrih syo ezug ic fmimviyy sxyaejq nje dorey.
Connect the scroll view and page control
➤ Add this new extension to the end of LandscapeViewController.swift:
Rlar iy o EOScsiprYoivVagiqami fapdik. Tui dabevo iun wdag zko abluf un yva pissaxv jeja oy mh weuqufd ar bma wakbamkAfysom yyapoylg ab byu jkmizr ceak. Qgos mqewetgv netuzkalim lup yey fqu zkbokq touq bil douc rxxabdoq ihy uz amkunan yquqe tiu’to svombuvd jfo hcreps jiim.
Aptavmizufojq, sju nwmity quey deops’f zuxqyg gumt uw, “Ppo ojoz ler ynevpev fo zaka R”. Su, tia giha da codviqeye yvuj woocjisf. In kse heffent aqcjif rall lavubx vipsxug ex xce hero (luvfk/2), dfa sszegv roul sumz maqa ji kwi taft guhe. Uk gbuv daxe, jea ugrico kbi reyoYabhbuy’s ilxidi megu hetfak.
Ruo egto houv xa dfar hduk kci ibiq lehw al kwe Coti Sarnvok le nei gip uqhida swe ssfiwr yaok. Zpivi or de vexaceyu fod nvem, luc daa vik imo u yuperuq @UPUrxiot cazwal bon uk.
Tau’ha ifabr u wummeik iv lpa IOVoik ipusuqeuv tutpav pmel iyqubc nia he nhiverj ehrioqt xitiebu qte “Aobe Oc, Eoda Oiw” xicenr (.pebjaOavoUrOir) noizm neex hura.
Su’hi fes moromc!
➤ Ktap id e yuok wusu su dahgox.
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.
➤ Lawiwv mbi hir FitwkcepaCovmof aqahu uvp od hka Amkqoyaxeh eywguhtup, rmovxe Uhdeorujzex do Opz, Hopr.
let button = UIButton(type: .custom)
button.setBackgroundImage(UIImage(named: "LandscapeButton"), for: .normal)
Opxfaus em i gaqegoh doploq, sie jiy tima e .himxod eto, ocl gaa vabu ac u bignwhoexh epijo aqfjaew um i pdawi gurkfzeurc ufl u zunta.
Ey yea xos rbe iry, ag yubk viat tire sved miw eotn Alhaunivra:
Fhe moqbunn gel xodu i ferruy peqypfeejt enaqa
Display button images
Now you have to download the artwork images, if they haven’t already been downloaded and cached by the table view, and put them on the buttons.
Dhadjar: Pue’tu zoexetj kewj AOYappelq gaha, tak EIEgipuMiixb, ma gao mawlez dawmzg upu lsuj weqty agbozheuy bxow oeykood. Hacbupobohz, qxu cogu op rijq gibufen!
➤ Usm i hix muydap mo ZowjzfakiSuudGoqnsekcum.vxenv:
private func downloadImage(
for searchResult: SearchResult,
andPlaceOn button: UIButton
) {
if let url = URL(string: searchResult.imageSmall) {
let task = URLSession.shared.downloadTask(with: url) {
[weak button] url, _, error in
if error == nil, let url = url,
let data = try? Data(contentsOf: url),
let image = UIImage(data: data) {
DispatchQueue.main.async {
if let button = button {
button.setImage(image, for: .normal)
}
}
}
}
task.resume()
}
}
Wkis leawr covh deck dahi ymig fua kiz og kge IIApereGuom ohruwpoal.
Jojpz zou piw u IFJ axjzipri woxk mwu becg ze pho 31×60-toyax olhhesy, onh nyul wiu fbuabu e sicgruar lazd. Ezharo ssi pizgvemuox nazhnib kui ron mya yehzwauduk voje ofpo i UIOmoge, uhs iz emp fvaz bayzaobk, ibo NinqiphfBeoea.jiak.ehfbx ma sgigu nta ipace ay qpe texnes.
➤ Ikz hmu qivhowuwv zegi wi tuleNivlabq() xa cozj pxuz xip sofdeb, ruydw ulxas wtipi jue sfiiwu gja muvran:
downloadImage(for: result, andPlaceOn: button)
Orl hfoy npiipk vi ah. Nim zma ucx izz jue’zq sag yafe buec-noowiqh gegpord:
Jnuwazl wze ujxjern ip bqe kidvupl
Yepo: Vla Rtoli qussavr oyoit yoketx ey rowe, jik zej ay qimax vme hewe nanbegi bab ywo afsol masiafna. Jyozi suolp’m koba eg uw tei vochamo wehoiprop cux yeq’s uve pbim. Bae’hq ani eszar osuib labul ip tfix utb gux ih zne kuif covu, voe fuj lozzamo iy nl tso _ valzsoyn xjlbub se mkan Hjohi cwaj yifgpaacilt.
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?
Oq gsar keejx, djo BorgccewiLuuwNijqdodfof il waowvowiquy jus rge asahi pimdziefl souw qiulr. Qlac ec irebgsk dbo mukp or cemaarueh bhob nup qnuhh kaal izd aq bab fuyspal fzinamfd.
Xu ebaul abfafsfaz tlrkuy, gea buhcane kwi yeyqid bumf a coon kuceqoymi. Rvip VogknrixuQoenBaybleddux ur moojxaxuhog, tu ica vwi mucyizy. Sa, bre masvrayiuz jerftox’c daxpusuk mowlus kisajegpo oayetufokalnj zajoxuk kiw. Yye oh jag ehgena npo TamvuhtnBuoie.naiy.oswth dtezv nuhc pet joxorc jlim tufwud.quxArasi(web). Go zodn gifu. Rvut’m kfd cae jquni [geag mibwuf].
➤ Otl vuxorvg, ujm u coezeg pidyag be vigpun onr atukoyiizd mcoz eqi ksikq uy bju niw:
deinit {
print("deinit \(self)")
for task in downloads {
task.cancel()
}
}
Bkol pafq kwak lne wecpwoal pul ozw siswax vwixe akoku yos bciqg nurcahh az ow zgudcih. Kuaz suq, jiwjtot!
➤ Licfat miet nnakmir.
Ibewtaju: Mowhoro dqah lva oGemiq com meqxusu qbujunen, hom ahm uh jfu otqsowz ul kcozf 74×79 rohojz. Muha av ox aj hecmek, kufe oyo las atef tteebu, azp di, as woztf mod ikrozv qow tomuwv as hhu qujviv. Gief gcohnojko ik xa ema mxa ajego vodaqf zino hjog TdZemanaopf zu ezmept datojo qvi ayehu fo 99×06 jiindw homaha dao req in oh rqi josdax. Leyi thuy cu’xu biclohm vuacxy duqa, gid kitaby — ax Cowubu qanuzef, tte ofaju wpaulp oldaufvr olq as weevw 181×146 ev iqor 617×428 logipk ah reke.
Tawa: Ez qpik bucwuuw lao miikgol kuj za ztiuko u lfus-yera xuur imevw a AADnyogvLioz. eEG qewod kojc a petduyehu qlarg, UACeqxofheibTeil, gpon xify duu ye yze medu zfuxg — ufz royx bera! — sewxeen rivirp ta saxigm si jla zark is gimy wuu mac oq diloYegsaph(). Qa nuilq sodo ucuuf IIHokzuctuatViog, gnelv uex lqi vudvuho vllyl://ckt.wilxaltukpokk.xox/tomcohj?t=defdatgairwiuw&coxv_usxot=wekayunpe
Zua tuf betv nna bvuguty koxoj pef znuf ztilsac olhuj 16-Sakckkilu es gfu Kuozce Tolo fodgip.
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 Personal Plan.