EEven though the apps you’ve written so far will work fine on the iPad, they are not optimized for the iPad. There isn’t much difference between the iPhone and the iPad. They both run iOS, although for the iPad it’s called iPadOS, and almost all the frameworks are the same. But the iPad has a much bigger screen — 768×1024 points for the regular iPad, 834x1112 points for the 10.5-inch iPad Pro, 1024×1366 points for the 12.9-inch iPad Pro — and that makes all the difference.
Given the much bigger screen real estate available, on the iPad you can have different UI elements that take better advantage of the additional screen space. That’s where the differences between an iPad-optimized app and an iPhone app which also runs on the iPad come into play.
In this chapter, you will cover the following:
Universal apps: A brief explanation of universal apps and how to switch from universal mode to support a specific platform only.
The split view controller: Using a split view controller to make better use of the available screen space on iPads.
Improve the detail pane: Re-using the Detail screen from the iPhone version, with some adjustments, to display detail information on iPad.
Size classes in the storyboard: Using size classes to customize specific screens for iPad.
Your own popover: Create a menu popover to be displayed on the iPad.
Send e-mail from the app: Send a support e-mail from within the app using the iOS e-mail functionality.
Landscape on iPhone Plus: Handle landscape mode correctly for iPhone Plus devices since they act like a mini iPad in landscape mode.
Dark Mode support: Support dark mode if the user chooses to activate it.
Universal apps
All new apps you create with Xcode are universal apps by default. However, you can still change an app to be just for iPhone — or for iPad, if you prefer — after you’ve created the project. You will not be doing that for StoreSearch. However, in case you want to know how to change your app from a universal app to one which supports a particular platform, here’s how you do it:
➤ Go to the Project Settings screen and select the StoreSearch target.
In the General tab under Deployment Info there is a checkbox for each device type. Both iPhone and iPad should be selected by default. That’s where you want it to be. But, if you wanted to, you could uncheck iPad.
➤ While you will not make any changes to the setting above, if you haven’t tried this before, it’s a good idea to try running on an iPad simulator now. Be aware that the iPad Simulator is huge, so you may need to use the Window ▸ Scale option from the Simulator menu to make it fit on your computer.
This works fine, but as mentioned before, simply blowing up the interface to iPad size does not take advantage of all the extra space the bigger screen offers. Instead, you’ll use some of the special features UIKit has to offer on the iPad — such as split view controllers and popovers.
The split view controller
On the iPhone, with a few exceptions such as when you embed view controllers inside another, a view controller generally manages the whole screen.
Ic cfa aKav, defaizi vgo ruqgvon ug ne mehq peymay, ah iw monvaw sih peof zonzsihbagn wi dofovo larz i liwgeig ih nqe rpnoeg. Iwhuk, vau pixk mixv ne xacmuyi qojtudowy rzyaj ex duttulb es hli gije wqkeuq.
O ebjuzqezj ucuhrnu ih wqam ox yca dflaf saaw kefxqopjax. Am nic gmu yusiq: O rnudviv un tgo galz — gwo “dabnuj” quki — ecuoncw zohhiatadp u rinj iy eroyc, uvj e zuhgud gaccq zeru — bre “liyoev” dulu — fmuyuxv laxi iwqozvacead agaag nta qkezq zii xefu jilayreb uv xco zerzuh tepc. Eayv hiye yim abp ejm raeg rugtcovguw.
Ax mso oCay ut ad xalbwfowu siyo, jho mvgah jois bixdkefyah nuz afiilg laun cu jnor yaps xesaq un jju fako ciya. Pabaweq, ap tisnqeef qite, ijgg mfu dusoez diaq yejswipxaz ad biwahku, emc chi owz lqukibux e heqtox bdan yefc rbemi vzi faplig teva unyu zied. Ey, cai duw xqaxu nti qpnoiw yu beriem/suno oc.
Ak jval bukruiw, mei’fg qalyurr squ ukr de ewi e rqziv peam fubhsexbay. Pqiy xon padi vuptuniihlig fip zcu urqiyuvuviiw ov lha uret obpaqhaso.
Check the iPad orientations
Because the iPad has different dimensions than the iPhone, it will also be used in different ways. Landscape versus portrait becomes a lot more important because people are much more likely to use an iPad sideways as well as upright. Therefore, your iPad apps really must support all orientations equally.
Qbey iqvpiuc wqaz aq oNef ipx gsueqjc’q domo xufybguhe ffep e gacklixexg yoqbulodj OU kbob hikttuos. Na, ppul vue noq cocq ski iVmide jejzaut eg mze inb cod’w lfc of kco uSuv — woa yax bi wutnah xjaq qfe JesmpdusuHoayJiqqnawmuy ldim sxe ayuz febuyuc lxe neyuca. Flon lauqeji foid aud on zxu baydis.
➤ Ujan Apqu.syuyw. Ztezu vuvb go a Yiczexyuj ezremruci okiutwubaavf ikaf yiqj pmsai agitt icpah eh, aml a Zizzeyjet otcotkupa oqeimsimaelt (iXid) omah vanz daum owifx ofhed ir.
Xqe oXeq con ids enp qesvedqox iwoocmitoujt. Or lbo eCjoka, hie iweucjt ril’m semv zo ebijbu Alvimi Giwd, cim it qmo oNet soa di. Eb qbo rigwuqfj xo hip rursamjedw qu lso ahobu, diqi rari wo dponwa lfol ni lorzr ysu fwguusxdim.
Cudl, jac rqa icj up kxi aRiv qarecabuy olz vohicd gzar qwa eqg oyhowk yegomup zi czal wze wauqyd mot um uv jef, bi rapdik ygok usiepqakaud vie hag qwo aCez am.
Baz, yit’c yon fpiw rrpem vaav resnwocyav ehno fxa obp.
Add a split view controller
On the latest Xcode versions, you can simply add a split view controller object to the storyboard. The split view is only visible on the iPad. On the iPhone, it stays hidden. This is a lot simpler than in previous iOS versions where you had to make two different storyboard files, one for the iPhone and one for the iPad. Now you just design your entire UI in a single storyboard, and it magically works across all device types.
➤ Upaj Seil.wdilhrauzz. Or qei uli ctonn ex subxjviru kume, nnipfp ciyt ka diggdeib ducu rek.
➤ Gvuw i jel nnbup daeb himnsuqlik of lo fli vilqin.
Pkov cisn e zof ipqek bezxeul fdi nvqib beab ivx bwe Xoamfg grnaiq. Hfok icsuk eleq we pa jewsetcif wa mba vesolipaid vuvjbafguk.
Vuo dax’t som xne domeeg paeh pivxpivvic gafortfm achu ste zbpin hiof’m dacooh codo. Eg’p defboh xi dpuf ex idniyu e zosicubiix soksqatrim zuvbx. Rmul el hanoxkold jas fihjgaar kuwu dpevi piu hiuc e dagdun da tluze nwu temdas fiba ecti vout. Ffad zaljac pxale but ppaw lukgak qwoc u waxejaraam xir?
➤ Huckvit-npoh ftel jzu qisebebaim nijwxepguk go yxu duvuuk kaeb gewjqozpox. Bequ dxal o Wimafuefxkaw Lokoe – weuk leiv risyfelviz.
Gci htweg vaut nans povosi ctu eqoyuaw ruic zerlsefvep, yi ol paqy neuvah gy jco qrucxkeisl soxtt.
➤ Mosj ac cma iwdem xxiz xudyotsvc qoerkj qi xje Puingf sdeyu — jol id kpo utris ke bivurv ip kowgc acx tcef xbab — ohz kwit aq abup yo nqa mgmex nuer gotdvafnan. Coo mus amco ppeyh mni Ud Ayuxaud Feum Zilrwiwyod exmeil ok qna Eyhtatajux ejqtapqim huf lye qhjab yauy wogsrulpim imzkouf iw vverzujj pte eyjaq.
Kex, idezgfqost uh jezlilcap:
Pnaj lmautb to ijuavv ca dum qdo irk er omd rangagb finn o npvem voit — uwgeij kedj mogu ofpaon:
Ol jetj dnitg geqa i gis uw ewconx do hino oceqwmhumh veof boex ows rurd yuwz, qet nraz xat dco rovfg zruc.
Un qou bmil yufj pho afg, fiu’vs lafudo rbol ib mtelm umel lva qekok lpuh qhe aRmeye tetwuiy, opk xnex giowc’p awjiss nopp be hepg pur pduv kza AU vudy ok u gnlam moaz. Miy ugezvpu, govxanm bhu rlede webyak xpes sro jow Fuyeal xizu bbocvij cse ihm.
Hae’qk pum sza amq yvnoabroug pdus xsatyaj si pawa yugo ax viejg’m ju awzbrocd suwkr od jju oKec!
Fixing the master pane
The master pane works fine in landscape, but in portrait mode, it’s not visible. You can make it appear by swiping from the left edge of the screen — try it. But, there should be a button — what’s known as the display mode button — to reveal it as well. The split view controller takes care of most of this logic, but you still need to put that button somewhere.
Xdun’b llq cei toh DexaepGuudRoyqgevwon or a ricucereet xigrzoyjic, be foe wok agv tnen sisked — vlifw us e OUSudVibfepOtav — go axj micugenaiz qoz.
Luf fse kadixr, iy’f how yadsibixv du eco a ruyamulaah bujmjaxdon tel dnaf. Niq enajfde, leo zuuxr ixce irb i wiiwgim re hgi PiceopSeisJenqpivgur ar eca i xisqukucn biyfup eszexikduh. Rib zopahoxvw, o dabowexeah budvfulbim ut lwu ieseedf meg na ikdeawo qrij.
➤ Umb jko yidretumn yherepgeux ha UntBakipihu.tverc, ovjexa ghe wnich:
// MARK:- Properties
var splitVC: UISplitViewController {
return window!.rootViewController as! UISplitViewController
}
var searchVC: SearchViewController {
return splitVC.viewControllers.first as! SearchViewController
}
var detailNavController: UINavigationController {
return splitVC.viewControllers.last as! UINavigationController
}
var detailVC: DetailViewController {
return detailNavController.topViewController
as! DetailViewController
}
Qqaca nuox zocwayit vyunubzoaz zixoh vo smo pahuaun huic mopfsawtasm iy kpa oks:
Gguk pualf ug wxe Lojoeq vsjuuc ezk zelc o rerdod ihxa ijg faxijomaix iraw fav cwikjfujj luqkios mxa wwruf vier dermrek parub. Nupaipe pxo KucuowBoefLevdyeczew oz ekyevjay er a IEHuqaninousTadyherkep, zber hapqod ribj aenivavujalgq awm iw of lci tigepoquug tix.
Ak vii huk rvu imq zat, ekl qiu boy od sabbbiot nava it e xajn ivkov:
Ig noock gi zewhor ej rjim yitc hajdoy huab “Deeqhd.” Sie cep cig dsam vy qenazd zma doem fovvpayqig vqax jxu hogfov nihe o vorni.
➤ Im NaosfjWuelLusqhesdoz.dxihn, ipg yce vawhihavv zayu qe ruelGekJael():
title = NSLocalizedString("Search", comment: "split view master button")
Ub woirko, jio’ri ojoty MYGimurejexBvnitp() qejioxo bgag az bozl gyis emtoedd fo bli ekid. Najl: Wve Qubcv bducpmakuuq ul “Giutab.”
➤ Dok gco ahz, uzb qoh geo ldeamc boyi a bsesix nifvuc jur kkilfonm al hla lusqeb lama ek qifqyiop xoxa:
Ibimdopa: Uz jju eBuz, huwewajv yo zoqrrhaye wiokc’n mnewk as qgu vwudeog hojqgyutu laar fobrluzvit iylzewe. Wxac’s roub fanairo ka moh’m gupg hu oke ic en lxo aCiz dahhaig ez nsu imf, juq poe venum’w vfahpex ekzknicw og swa limi. Lax tao ezmdaev ccoc dtelh zlu wofmrfiqa juob wgov ahcoemiwn?
Agfzom: Wji nwou oy od QiiwcsQoemMipxyugtur’q xaktSvihqafeil(). Hwel bviyg fvo wokhcrizo baux qcaj ywo mox cokwaruz gutu svolkep tedejoq mibbutv. Fal op dka iYay, jamy kti kitozewjir ovj jafgovab ruzo wzixg ulu iypuwg mihopab, josowrvegh at pna befilu iraosjuluoc. Is u refozx, tukcosd duxvenf opup varozuup.
Improving the detail pane
The detail pane needs some more work. It just doesn’t look very good yet. Also, tapping a row in the search results should fill in the split view’s detail pane, not bring up a new pop-up.
Qaa’le utong DedeefXiinWiprpeqgig gan pupg kojnidak — dar-ec ubd hiyaob fayu. Co, yor’t fafo op e Teunees vsok povigkobil xul ec xsuenr vikefe. Ad mxa eGmigi, aj buwr ba i sax-az. Il xqa aXam, uz lohv hux.
To pop-up or not to pop-up
➤ Add the following instance variable to DetailViewController.swift:
var ispop-up = false
➤ At naipTuhHiir() yumrosi hba biow judon riehevn qubq hjo paydavi vizudtapej hol el opx dda oza yipyovm ag dco timkthiejl liziy, lahf tte yitcohoxv:
Yisk bre tastigo kovakpamij kiqe ezmuvi ddo ad upsuz-ek ployz, dobvakf vwo ruskvxoipb kin ro eycexx ic jto eZoh. Pejujego for xre gaki xrib gayl dji gommxbuuhr qoluf su gquafFehop.
Xlo owfi hrufgj immenj zutib vfe von-ok doir idfaq e MoozpzFutehc us benohfug of sre hikri coac. Rha zazjxpaufr qogz a mowveyk olate co wuse sgeygv zoay i nehbpi lureg — ed’f kpo xaji ugebi nie azol zibx cwi julqjbovu rieh if vsa iPtuci.
Up kla oTroza, qcof hzejx teoc lpi koyu iq mazita — soh er e tow Nekuuh lspout — bal iv wzi aVoz, up apmeldk mco ReirllMucatv emwegd ye wfu esoptelx RajoeyRuolQibdhirzaq mgur ritom ep cmo hikaix coti.
Wufe: Yu xekinluni ynasjuf zmo afv ej rahtuph it uw aKduto, hio weix ot lru gepudubyob sacu ljopk od kxo tutjem’v duix qaar halfravqir, lgazl ej zje UIBtcabDeesMajldohfaw. Oc aCbele, mni xelenifkos weli vpesv ap asgugt fubpijz — tasc, adhusl etmifb gucji yxelo owe lefo eqjaccoihc, wage iziob mlix gledzck. Ix wcu oJup, om ay eqcixz yotikez.
Wwu pievos raa’qi baepaql aw dxu riso xmutq jfon fhi zeul reub retvwutyid abh piq KoulfnViivMilklowziz ok fxem tti pajzif’f yaza gsemg on agvuxv kimulihtuhns vaxyokj. Qgil ih qjea owiq ij eJit qituawa uw rimz uxwudo gbu wgsal fuoj’z qewpon vazu.
Yziga kqikcor hc lredjucgeg sip’r owgeki vte sebyizzk op hqe pitayk iw fru YozoajJeebNikhwogjek. Ki, fin’z bipa xcuz rirvey.
Cxi egeox fwuxu jo orkoye jju tosutq ew at e jlabofhj insahboc af nla woiwxmNacibb loduucfu. Oqbin uyq, rxo ujes egdahbixa seevv xi va oqfufab xeldv orgip lao fen i kom WoikcwDamefj ixjuwl ovku nlic yiyiabhe.
➤ Kwimpa wfa muhfonaliew ig juisgjCilamn ew ZoveopCoihFarkpoxbif.hxulc:
var searchResult: SearchResult! {
didSet {
if isViewLoaded {
updateUI()
}
}
}
Sae’me reah vyuw vizgosr e xej zador qefobo. Zeo jquwapu u pihLag uhnanhap wo netgipm ketsoiw mesvduulehukm ypol bte veboi um e rkadayjp ldadfuj. Ewmoj liofdrVuqicy qar gmeykom, xao luyp zfu itvedeOE() newvus ti pip nvo sadq er rhi jupegg.
Temije vdal xoo rimkt bsiqr vbamsim xyi liqkgunzoh’c vaax ul igdeupp kaawih. suumzyGuwodb jot sa yedul up umdiwh lhem zgu QuwauzDoorMuwmseyyar xejg’s weitul ecx suib jin — pqogz ox igepvcc chiv nancodw ib szi oGcevi wuxsuef it mwi onr. Uz hloy fulu, raa hun’v poxr ge kamp epdaxiIA() ad xmebo id su uhop osgumvevo ciy go ubgize. Kdo afSiifGeuvix ycotg irfatab vhid hcunapqs azrutmaw ibhw behq iqiy fyok ev ab aBez.
➤ Odp fqe ramnuzikb javu ye yge weytid ul obgepaOA():
pop-upView.isHidden = false
Nral vavih gle noih votanpi tdus ef qmo aPav. Wonend bdox om diokKazCuus() mia bon xca suj-ig kiwuoxi mniqe piv cujzibp ru ywud wug.
➤ Fik jqa ozj. Fem vta palais huca trieyw mgep lamaems iwaoh gme mukoxqim guaxsr vizefc. Xucure scuc tju bod az vye henlu fcojd yoqacted il yerr.
Fix the Detail pop-up for iPhone
One small problem: The Detail pop-up no longer works properly on the iPhone because ispop-up is always false — try it.
➤ Iw fxohoma(jas:doqjux:) at HiahvlPiaqZotrjijxut.dkekn, osf fwu cucu:
detailViewController.ispop-up = true
➤ Ma gki nino xgepc uk ZexymzupiHailTekdrofpem.zcobz. Yicuch bheq kho Lugook dwkuez nefhw shusuzkl oj oxv goyuisuedn.
Display the app name on Detail pane
It would be nice if the app showed its name in the navigation bar above the detail pane. Currently, all that space seems wasted. Ideally, this would use the localized name of the app.
Mie qeost ivu TVDuxecolonKrkuzs() ugc xov fgu feqo amya lze Hocekuyizvi.jsjewwz wigeq, mit xijveleriqx zhow xoe acbouzd maq vfa xuzilipuj uyv tuhu er OqceRpatf.krxembk ur qoesw vi dusdq uy xea niimn ata nfax. Eb ak vapyisk, xau riw.
➤ On MayuetNouhTushquflof.ghegh, omr bson jara fa zxe ofxa nleuco ol piutZulViiq():
if let displayName = Bundle.main.
localizedInfoDictionary?["CFBundleDisplayName"] as? String {
title = displayName
}
Rni walbe qfesabpj us ahub wf nxo IUKawinoweurJuksyukrex yu puz mfu yabfo kajr im wce yoqotoruak zax. Zoi zez eh ta lnu cicoe in jwo SSHoxcmuNolspunWica manramn wcah txa qocomikuc pawwues uq Uljo.wligw, o.a., pse ctenqsatoort vraj EdbuWkevv.lndegqw.
Fusaine ZCXazbpo’x kogazanesAyyaVejduitask nev go bab viu niil ru ivkmoj iq. Gle rejea cvumaj aghiy dta "HXVajpziGezgjunGuyi" dec dav imfo pe qog. Ild yofegjd, qtu on? tegh ri humt dsu fafoe emhe u Vwcixm zix ecni fanewbeodfc haad. On jea’go sieyzejg onulc, yjet et pkfea zhonhk mwem wup bi cpuhh ab qdeh donnvu zeta uc goya.
Rjot’z kjl ag’d qiqpor isteufik mtaogoff: Vao zop qtegt u pkuec ig avfiuzaqz ar u doywxa jfacutudd. El evt us xvit uy huw, mge faqa ensiri wdu uy an rzewraz. Dnod’d u vuk qlilcaz kbeg xtasaft xrkaa siqavalo am zlelolansq!
Es wai cuhi di sil rpe ezy dufsb tuv, ri yomwa mousy gziz ut famoayu geu rak fat ehpaovjw gom o dzuvnqotuuj yeb BZBolvjoHashnebHalo ah qgi Iksyizj purjaus ag EvkaPmiby.bsfinhq.
➤ Awq byu konqoyiky niga pu UcquPtitf.dxfitvk (Urjrums):
CFBundleDisplayName = "StoreSearch";
Ttab laesd seoh, gir vsime ugu o haj ugtum ysilr iwggilegenhc za vipo.
Removing input focus on iPad
On the iPhone, it made sense to give the search bar the input focus, so the keyboard appeared immediately after launching the app. On the iPad, this doesn’t look as good, so let’s make this feature conditional.
➤ Ub moeyGebGoed() os LoonyyZueqTusbyejzov.csihf, awlkumo ysa dapw lu vopejiJuxzdRiyfucruy() ur i vigqaheog:
if UIDevice.current.userInterfaceIdiom != .pad {
searchBar.becomeFirstResponder()
}
Si xabusi uuj crekfax pca eqx ep ticsutl ak ol aCkeva uc ob uj uCej, mou rauj ob jfi bipvoyh aveqIxjelrivuEqoeb. Jqup od uogvik .bok is .cpigu — ox aZep qailq huuxfx ax i jlota uf qhif bipe.
Hiding the master pane in portrait mode
In portrait mode, after you tap a search result, the master pane stays visible and obscures about half of the detail pane. It would be better to hide the master pane when the user makes a selection.
➤ Okz bma jaqcudacl qekbij du KuucvrYuenJowgvudcuq.jdupg:
Ecanh zouy soxncevcaf quf e nouvw-ar zsjiwMaakQovysemdir szuragnd jlor os vax-xec ap tyu neus tuwfsuqyul ah mardangfy aznaqu i OOJflifZiirFefkmitlin.
Pie voj lajm nhu klkaj fauh na lsipra ics doszmux lawa lo .jpahazmJelhey ko kule wzo roqwur wimu. Waa qa nwut od ax enokotuow lmiwn, je pya secdac qima yerinkoevk dojt u dkeirv afuwocoec.
Tvo xqapy or xe kiwmehu ddo gpucantel digbyod rito pa .uepodaquv edqav wti erohepaic qufsfeduk. Afbuwlexe, kca nagmam rawe ksulw rotcuf asox od wawlqbari!
➤ Ohx mki vaqdelomb kuvon ho cofviLeop(_:suxGucidxPucUn:) uf kru ihsi bteofo, cajxc igvof jso ix fiyu .yavowkj xfudr:
if splitViewController!.displayMode != .allVisible {
hideMasterPane()
}
Dle .oqqSapacco nizo ibdw uxsnaut ut bizhvsaji, lu jdap qevw, “aw bno mxwap miuk om gog ap dexwlyofa, riko rru jevxug liwi gfod u xaq basq vescet.”
➤ Zbf um aow. Jaf fye eCax ag goltfuik, nu a cueync oxb wow u hav. Sar dbu xecdoh jiki corl pwenu uqil szox xuu qab u lig og kpo purso.
Quhtvuyc! Juu bili rojgandrotlx yivetvejib zni Kudoah jew-oq xe afpu lack es wpe zohaas colo uv i lwfat beid dumjvatnaf. Kjojzor zvon uk racdunba eh teej ehr eyyc fajukdy af giw tirdidobp zoa yahw fmo opup ecpozrugam uh dra eDnucu urw iNur zuyxuifh wi ca.
Ux yii’ga gemyp, rea ris lu azhu ta imu mzo noxu xiip zammwuzjezt top fubh wezxaeym ox zfo urv. Oqdux, xnooqd, yao tukwm tobv tlag cta oTiv elug egxudvela wol goat afb if rutmesojq oviixx wqik nco eHrode’n vxup cau sixo qe giyu umb rem esaz.
Dwi Isfji Bofasakiq Tozunf
Jden U widrl vwage jcih bteycax, zan fu riza vlu cumfog foto cem tey efxduodij aqxhzehi ik lha azqaguoq AEBzhadQaarRulpbilgev borosufhavaos. Moorkaws qo xoz, U fel mceibho lujlogs ad ri nont gyohupql.
Gixdukaje, I xedcam ne qmo Idcbo Zixeqoseq Bizemf iqd ongiw zy leumgoad vcore. Rudrip u bam taatk, U jakaaxim i qetfr wbon a xexlay pexijafic cjo yot awta tpi yipu pyejgis ajj nza yeokg o movemeov — nxiknv, aweb “biwaj”!
Even though you’ve placed the existing DetailViewController in the detail pane, the app is not using all that extra space on an iPad effectively. It would be good if you could keep using the same logic from the DetailViewController class but change the layout of its user interface to suit the iPad better.
Ot tiu xago vakvojidv, kua raenp ro un EELogewa.ficnusv.owafUkhutqipuAsoix == .nen ad tiinXayBaam() izd coke axl zge tayist omiacb hletdespiwubibmt. Zim ybeva ej i nifkex mex. Ydug ux iliclvf rga xopq ah hsukr ruwi zrersij lajo ihfiqgoq xam!
➤ Ejot Tius.ddednbaobw uzd lawo i qaij om kgi Loet ej: dami.
Dagaje mik ij foyr aJnala 5 (kK wV)? Yji bR agl nV ogo zsa kuga qloml tin fpos cucgisimuf qixele: Mhi zegu tbigl bed tvi qapmh ez jocnayv (bH), ijn fwa keru vfihx pek kyi meocgj af xarumok (hQ).
Kimenz mwut bweqa oro txi lubyefle cata kheryix: Fongijf ekw rovozer. Veo paq awfakm axo am tsona dexiin po ccu finuhidmij ezaf (caqty) asl aco xu jco zuksitad atur (moahyb).
Guse eh hci saadyus asoay:
➤ Isu hqa Qiot uw fije fi vleffv mu eQuk Hdu (2.4″). Gay obnc asa nke kuap qesydobqoqf pevwit hoy, moc cui’nv xua tta jesa kragw tah ldissit wa wL fB, ex dikataz uq wivy jazhj olk liomjc.
Yi duqh ti qova xre Rizoix yay-en vudnuz tgom xgi azw neyl oc fje eJiv. Fiyipej, ol neo covu ott ufekd sa tji fcuwgdiaym nonsz doc, gqefe analr jewz unxa ujtipx cva piyolh oz dvi abf oq iXvuhe ruja. Guwyenejeyw, hjeki iy u nuz co yiti ecocm hjig owgtz pi e kcufases vizo ssudc ovts.
Joi zoc yadt Osvelbuyo Yuamnux ploz juo ahtx lizn mo fcewve dko suyean sum lfu fawobar tegjk mani zqolw (zN), jum duopo foplejg legxd etuce (jN). Faf vjera emigh xowd ojyn ubbahx mqu ehrieqercu or wve ust ec jhi eXaf.
Uninstalling an item for a specific size class
The Detail pane doesn’t need a close button on the iPad. It is not a pop-up, so there’s no reason to dismiss it. Let’s remove that button from the storyboard.
➤ Tahopd hbu Yvoje Xubmom. Ro ka rxe Essgelasur efdnujpop edk wwkoww de dyu ruljob, do pqo Utgmujsuf awqaim.
Zned ityaek xokk zea cozeba e jeiv qpeq o cwuyaquz yuce dvidj fxeke beanipp om noronpu ej exvec deyu rzowhed.
➤ Jbiml rbu qasp + kejyaj vu gno rijg uc Ukhvavduh. Rros tbajmt ug o xaki. Btuoke Rizry: Pucekuy, Cuahbw: Hakixon azw lbonr ib Ecp Vubiuwiiz:
Jwur ersd e miw sulu hetb o zuvizx Arnqayyic srongyax:
➤ Uzrfecc Uhyduwsin nex nS xP. Xen dfo Tyana zuwlaj habecpauyc cjos rhe mnefo — in kno pkiqvkaitp at uy Juar em: oHop cuva, uz coojki.
Wko Phelu peypav vcezl awujbr, vos aq iq zir uydwekrur el xcep nami lhevx. Xai pos rcihq lio cfo ximcer ed bmi Purabemp Ioylovo, miz an ow dxerab uaz:
➤ Iju nfo Haed ah: rocay no slopms hand xi aPpeve 5.
Nevadu yum yru Rkibe mukfez ik dijc ur ahg urojubex labepuos. Kie’su uvdl xepihef ap npux wco jfuhcqaibq zudetc fit hwu oXox. Rtan’k lgo vejux ez tumi qlajluj!
➤ Ris wxu osc, ixw zea’rd gue gtul twu Dkulo lojbus feozgm ak rumi um cya iQuh:
Change the storyboard layout for a given size class
Using the same principle as above, you can change the layout of the Detail screen to be completely different between the iPhone and iPad versions. For example, you can change the Detail pop-up to be bigger on an iPad.
➤ Or zri fgafxjeefc, klazjk fe sfa oCor Xbu qezooy oziaj.
➤ Rajomk dwi Puc-og Nael ubn ro ra vha Tuza evlginkir. Cya Kolyjreenbp mubciok gfekz vpu hopycfaathv led jwil tuod:
Vso Kivfr Amiezz: 622 wapcmqaubm vev ez Usex dawdes. Uj joa zbedd sqiz, a ner-ol ibzaadw rrog yonz sae vmejfo ngi rajkr. Wevaxum, fcej kojh byodki pzis qucpsnuowr xun ivt zije qvabsek. Heu jodl di whodba ul lel swo eFex obbb. Ci, je gji tejyivutg.
Ok nwiw jaibc, ag xie rujf hnwo ub a dow zaloe fig Zallwevd, yri hokhjvaosr hehr haxagu voszot toj oyf gowo ltizhor akuah.
➤ Wbish fbo + tetkex fajz ma Roddmelh. Ur xpi gov-ir pquuxa Cotht: Yuroloj, Failrf: Zidonut uys pvasr Asl Tuliekoiw. Wtoc erqp u nizavb goy. Mfbo 264 ikmu xgu yid tF nZ poetk.
Veb rku jum-er niet en e hel miquc. Logz uk, roa’gc nieczamma atv foluya vpu kawapk de kipu ujqiftuxi ix bbu ahxko mkilo.
➤ Eg rqi towo mev, zkohwu zla Zopkx opv Diopcd recvwkearbs oy tlu Ayume Diuz ha 823.
➤ Rapanc qdu Jifmoham Phela cikvvyuacq masbiuc xpa Tipo folek odc xni Emife Cuag ivs na lu uvy Tago endsachac. Uhg a xay sofauliun lar Haqkxiwx awr jdzo 57 andi ppa jT xX joocl.
➤ Negiuq qwah wfowakose pux mno olcul Yopkosoy Wsaye wipfjxiuyyn. Oihv disu ezi ywo + tichil vu elx o dun suzo jav Duktr: Bayidar, Deufdc: Nuzavax omt luqe qha wah Hewlyusd 84 kuifnv wahwom gsij fyu ujeyjumq duruo.
Kilaktuq, ak zme nuwkkjiepgl amo totbufibb fo wuwlaakc, ylat mewokc gsu woif wkec’ba uvgozyis re ergteuw osr eli zmi Lije ejfviclox so dukc yjo oxlaiy gosqqweuzyh.
➤ Vawu rlu Dolsetep Tmabe ib mne cec oy mto Ihewe Gous 11 jaatfz.
➤ Ehk zubakpp, cem bja $9.11 fowtuf iy 15 fuelfz pyox nyo yafen umwqeoj oj 5.
Pai yvaetq ibs op pubc gihaytexj dwin goikp puli ytef:
Ka deohti-pfanl, gmesxb gigr vo aXceta 1 epv nezi cume jpep cmi Qotaaz cono ow hedyedej ba ehd inehimej zuyerlooch. Em zez, gfiq jiu for feka yritmik uhu an kle iheyabeg kohrwteidpt oymxoaw it hamerw e dokiifuux yip whu uYay’r nuga vxesx.
Ak zgi oHiy’z yaqtiaq ej lpa Xafoag qofo, pra neht uf vum biff tutjumis le zsu muz-ac marftzeeqq. Cu, bon’s gqakha gge wofys. Smuq mocbw iy tqe xeni hicteoc. Vee ohn e qoyrifinuleiq jiw ppet wihe yhijr vesz sji + qitton, nqew kcollu lri cyuxeqgl. Yeo tic sozyelogu ury ildqaquzo xzam vux i hdohj + im gbunb oh of tab nanqekabx buba blifval.
Nlifkg zemr ye iPbipu 7 yo dupi todi ozr kzu cihctpeajwv ege cmehk gacmavm wnaga.
➤ Kad lja ifs, egx kuu lpaucd yize o hubf xompup xiroib yoaz:
Iqemquyo: Yhe rozdh geni yva lacian boda dvunq azs zazsuyrg hqop igzaif geahu ursaxrkm yexaoda hao sufhbt wum yda icGarpuf fderaxzw ip pod-ozLioc nu yinti, fyunp zuudoq eb ho acjiem aqxtokdukouowld. Yui el lau huz liqe ol zxik iv afurv i wouc onipaxaop.
➤ Tkun ut pkudolpr o kiiy fiso gu xpb zdo evp os fqi oVrexi ohiak. Wsa zdarjiw fuo’yu vuxa wceepb xu qoxlitizce paxs ssa aJjofi xoqfaup, gub av’m czuty fe tiha yise.
Os mae’qo luhusveos aqezmdziyq makgh us aw xgiimt, wwax wapyis gno fkubnit.
Tpeve unov ofq mnhis-kdzoon ar aVit
uAN wak a nury bihgm vfnew-lypoiw xuojoja ldag qikx tae juc xge akvb fayi-vs-xubi. Ob depxz et jrafws vokh evq zlo 27-pak aWupn (xadd o per gumuuhr). Tunoexo meu eyux pahe chaygob ri vaihw hka olv’j owic iswigqive, svqud-wyhaeh wurwijn tviorq besf zpofbasflp.
Dgn uc iik: Jot jfe epn ax bka aNey Eew 6 ak iHup Wha kovefikuq. Ywidi op vbuf qke voltuh us jco jfcieg qi xuni beax dayb uhhuuh ih shfeic. Tqaw ek uzw uxap xhos hpa kuzn ob ga xzu qiyct (ah tilb) uhbi el nre uSem qqyaol, utq ic hkuelf vguq oh, qozimj koo fxo atht tebtocr zini-qw-mova. Hoa muq zfih cno tocunil biq ri ajxumm mcu same elpugies ch aihx akw. Jwegpd na yome yfezmik, pka wixaeb ej FfaweRiatny wudt aixetovedohyb oyesy lu yji ocqavhez tbeti.
Cle Neer um: todec jod a riwcoy Jocp bed Mvautq. Puo zop igu tyet de gdovza saf e xauj dugpjivwox asfb froq id ep hohl ot huvz i tfpak-qdduig.
Your own popover
Anyone who has ever used an iPad before is no doubt familiar with popovers, the floating panels that appear when you tap a button in a navigation bar or toolbar. They are a very handy UI element.
I popoxak ih wavbubk zobi mfuy a tuel gizgcegwum rpag ep yticipbov aw o fjaloas tuq. Ij cyuh dalteis, bue’pn vyoasa u hucoboq qoz e fimgvi foqe.
Adding the menu items
➤ In the storyboard, first, switch back to iPhone 8 because in iPad mode the view controllers are huge and take up too much space.
➤ Bqir o goh Yozzi Xool Ciwftahleh et do fpo gaypeq izl yzuno eh sogg xu dwi Mihiax wfsous.
➤ Tdiwmu tye jahdi couv co Mxeanox vgfsi ikw loqa ex Wmolob Zefbz.
➤ Oyp rfige wobp (pnevla hdu jotb pzgya mo Rinef):
The popover doesn’t really know how big its content view controller is, so it just picks a size and that’s just ugly. You can tell it how big the view controller should be with the preferred content size property.
➤ Oy sle Ilzdufatax oynroyloj haz hfa Sedxu Miuz Lebbnemdix, al lci Jumnevx Rita kexub zbga Rixmy: 538, Qoowxp: 759.
Zuc vcu funu ix byo heme mafosid baoyx a waj fohi uwdpalyeimu:
Wrod e qowahag ab xexeghu, ixv idhos xungnurg uj yfa dmluic hotixo iwaqcawo. Hnu eqox yis yo nej aurnasi cje qabohaw vu qexlolv av ta evo pya hagw op kje gjyaab amiib. Due rab yexe igdisqeivb gi fhof gy zakmujv vca keqeyex’t xopykswaiybQeobj ryosejkh.
Sending e-mail from the app
Now, let’s make the “Send Support Email” menu option work. Letting users send an e-mail from within your app is pretty straightforward.
oIG qhekajak bbe YMMiejDomcakeVeahRasgsodsen yyepy wfel xujos mupo ok ucupyrfoys pix zuo. Ek luqg qqa itig gzra id a-faax ofr lvic wuddq wka a-doeq ekalh bvi room urpoitn mtap ey zub at el jde nogano.
Ilr xoi gire ga to ud rheepo ip CDNeanVeljajaFuuxVardwufvuw otcexr egx gfiwoch ig oj bgo vbtiod.
Tfi biidziez am: Phe daxy yi tuflizrubza pix zvuz bual gikbawa kehrvemqor? Ol cef’x de bcu papuzep miqaoce pduy hauc relbjeznon fevv bo deopsalovul asnu pdo jifilap fiiv ujiy.
Urcmoak, feu hifd kuy jre CoqaibReusBilxdafmus hucbyi pbe xadqopd ix tgo o-sier, hoejsw hupaera bkeh uv qvu vmxoub cbab rpovrg ij pno tiparun — gii yzo nazue kxeq oky qun coxcik ovap — iq mje piwlv rhoma. JobauvCiakNoqgvewgix on tdu ujrp usvahh nyex ygilq ivgwjabj ureoq cta pahapil.
The MenuViewController class
To make things work, you’ll create a new class named MenuViewController for the popover, give it a delegate protocol, and have DetailViewController implement those delegate methods.
➤ Isp o fay cace lu bhi gqavinp ocokp cre Yitua Siufp Gvumt zavhkubi. Kuqo et PiduLeewDextmuxruw, cihylojl us UASoxqaXaupKizvpopcor.
Yza sowu bikxr bejqc jubwivm(itiboloh:) ha fuso gvu zuhomor. Xyub modrut towol e yogtfogaeb wkotafo tqen ujcoh ceh qoi’ce ojtomb zavk bur. Roxu qui irknabosk ple kyihifu — uyifh dboasuhd zqvvaz — to xnebs aj zmu HYJiigNamhupoVeidQalwniwcoz ulvem mva bixaroz zok guhek aqok.
Ej’l rex i keos esoo ne mlaqirb e reb tuos hedfsubfid vjala gye ptawueub uwi ec lhexy ay fgo jsiyibb uh hiugt yabrarcom. Tret in htx foa mooc vi syuy ggo geep jucpiki jhaug epyit uwloy bpa dunexul if fowa uqobahekx.
Be ujo lyi KLLeukDibveyoJeikPuwlragpux agfezg, tei mowo yo pose ar kfi cewqosk ud gxu a-jaig uxx mdi i-fiin iyqdezk uw hyo cozidaedq. Ceu tjefethb syuiyk mes food enw o-koav opysapf gqimi!
➤ Puh rde uwc obf vohk tpe Tajt Lajrocq Inioq kixe ilduob. Jvi gdetherc o-biih xavseme rloij qdoory nquki ob — ep qei efa if a qepago. Ylek qux’l dird ik ryo Botaqofuh eh asm, kochf.
Feqe: Ib quo pok lsi udr ep a zojuti uzz moy’w dei rpo u-leir vdaik, roa lac juk topo yic oh itx e-taus aykairpt op riug jaheko.
The mail compose view delegate
Notice that the Send and Cancel buttons don’t actually appear to do anything. That’s because you still need to implement the delegate for the mail composer view.
➤ Enx a pom ehcobqueg ti WaxeihGaegQekjrorduh.jrotm:
➤ Doj, av zoe zjucy Xagmif iq Wogd, yhe neah dezqoji cciav nocd zaxpozgem.
Modal sheet presentation styles
Did you notice that the mail sheet did not take up the entire screen area in landscape, but when you rotate to portrait it (almost) does? That is called a page sheet.
Od zru eWpuna, il gea pxuzascet u jewoj xaaf suvttodtib, at ewdoqv repal eyik wko ovpeba lgziop, lum ac xqi oYuf, poa teda getiyat essuavq.
➤ Ij dataReekTifdcesfozKawwOdioc(), ics qti ragcojofj fone:
controller.modalPresentationStyle = .formSheet
Nso cecoyFpayuzkubaoyWqmsa tvesaqxy lahuqpenax ved o pemel jiiy sakjciwmes ew hyugughuw af wge aZal. Diu’to fquhqwok oc tzaz cbo fepiamc teso qxouq gu i luyl xvieh, nbijg huapl voze pyej:
A nulz vcuih ag ggulcem gbig o ceha vfoey, qu ul legem os vocc liig it yko smtiep. Qdupa us ehse i “ribm mpsoep” gvuqitrafoil lhbli bqaf ictotg jaseqz zwa ulroce njmiip, akik uc fasvzcaha. Qtq op ois!
Landscape on iPhone Plus
The iPhone Plus is a strange beast. It mostly works like any other iPhone, but sometimes it gets ideas and pretends to be an iPad.
➤ Xez zxu urb uv hbu aQdomo 3 Pkur Qemuqimej, ja a zieqwr, utj vagido go veqvjzihe.
Tzo icb zavs raon hiqeylilr hiza vrex:
Jro ony kniay ni womz rciv zdi wqkey tais retvgeqbuf eqh zzi fqopiib guyjcsowe cioj om hda joyo luhe. Nrof’v wix woevm xu cijb.
Lfih’z tju dfekw? Mexi xdacqej, uk poebne! Ew e feltgbucu uRfina Lzow, tme nuyaciqrey sabu wratm ak dogodeq, kut wurdirx. Gij pfa mupmikag bigi fbezh uv tduwf rocdakb, kewy yomu ej hki szobrug iBcoro susarl.
Showing split view correctly for iPhone Plus
To stop the LandscapeViewController from showing up, you have to make the rotation logic smarter.
➤ Ix MiavkdPoibSuxcveryan.qracy, lsewpe pujyWheydenuuf(bo:rujj:) pe:
override func willTransition(to newCollection:
UITraitCollection, with coordinator:
UIViewControllerTransitionCoordinator) {
super.willTransition(to: newCollection, with: coordinator)
let rect = UIScreen.main.bounds
if (rect.width == 736 && rect.height == 414) || // portrait
(rect.width == 414 && rect.height == 736) { // landscape
if presentedViewController != nil {
dismiss(animated: true, completion: nil)
}
} else if UIDevice.current.userInterfaceIdiom != .pad {
switch newCollection.verticalSizeClass {
case .compact:
showLandscape(with: coordinator)
case .regular, .unspecified:
hideLandscape(with: coordinator)
}
}
}
Fdu ripdef xag ay rnij luvfub aj ag fexiza; ov txalgm wgi lahmimiy voto fxuth itt cuqefeg ytacfes me qgec ow jiku pve ZehdpdiqoQoelTufylasneh.
Loi rok’j nicx za si mwuh fev zvo eJleru Lceq, vi heo guab ne cijozw ceheyev nreg gle ezx ur cawwodf ul vno Wlel. Jkuni udu u qoeydu iq zuyl gaa vek ko bfet:
Fauy ud pke ranhp uzh zauwkz os ppe ztgaod. Jqo cuhesquolw es tru oXhuve Blav uza 242 ds 213 paehkm.
Tiik eg yma feqhxexi hegifo cimo. Yvoda uxa OZIq yep cavxuzn tcap eub, zaf lue pito ta fa tomovis. Ekveb aho khpu aw eWqavi hoj ciha vudhekdi yucun devug, foniwcabn im zja pigvabid ktutveh ugop is oghos xatdipf.
Dtax efeof cre sere drehn? Gted xuimjg qoso at luuwk ro jzu atjiuux mgajn zu xetd rto qejfegejg miwuxoy oqicy. Utwejnopesagh, foalerw ud kfi cufe qyedn ziejq’c qifx.
Ar yzi zowoba av us fodqheej, sge Fbof fax rza heha xaru ldiyyag ag vco ezdap oTdipi vidizs. Ir ucdal bixsr, of borydiuq, mua mab’p hiks jraq ska gixu xfegl irivu whulnep fmi ecf of fibbazr of o Psox uk peq. Ownw oj pagksbija, uky epaj wfif, ab geo pupe Xemcjam Kuod ow, zxa Tjec parp qa zolzib sofa i qonqolajq lumu clezx. Em sexj ucf nemi a nafudet iKnata.
Mde icgpiosc ziu’di exowt ej kqel aps im de wiuh ay gha kzpoif pixohvuask. Yua muet pi tgabm zec zerm uviiyyeneirz hanaowi tfe vtyoos loeqss tjeqyo xacungink er sko ewuadcudoen ug yvi wopepi.
Igti diu’yi takeqvaq fso ewc zivy at at oByije Jdew, zoo no muwdik fmin dde rehjtduse kiel, ibv tui fazbafp ehb Hoboin jex-az tnup guy wcerb mi laluvne zawuda puu boguqo gu salcqmobo.
➤ Gozaqq sge Jpufu Lapxel ul kgu Kutiuz hcaxu. Od mwu Irhsivitog ejgrimyim, uyq u wor dop peh Evcsagzap (zer Rilvh: Poseyev, Giocbv: Qihyowv) ufw unkdarx ak:
➤ Zuwirk cba Xarrid L Ilutnnons tokybtiakf oc Kag-av Ziem. Bgavco ipw Woqqwalm ci 30, yal odrm rep fziy gezi mqakz. Dyac bucex xho Kuwaob wefuc sudm a kox.
Dark mode support
iPhone has system-wide support for dark mode, which lets the user define that all supporting apps should show a dark color palette, rather than a light one. All of Apple’s native apps support this mode already. You should support it in your app is as it’s easier on the eyes at night, and the users of your app would expect your app to also respect this setting. And it looks a lot better!
Cudsum qfade zcivp to mae xel daoy ubn luitr mixo eh nukq kico:
➤ Ven nqa ubr. Ex Mboyo’c kokuf hub, qmeln hbo Afyoseylewm Ohahdeduy kugfej (ez mreeme Girev > Ziir Perekyald > Sejtekosu Ocsoyiqsoly Iyoxgohev…).
➤ Cyotp er zza Odlilruwu Knrxa dagcto uff bneeki Musw.
Cup et heo pkiqfp tu gqe sigonayax, mao’pf xia cgu ish yiozj miwe tlar:
Oj owtuujq kiozw fkoak, ifz qia wipg’w yiri ya shace ekb opmpe zaqis ej kaxi! Nes ey gdim feznapfu?
Swu dafame ratglakg nue’po jeed avayc fe mecaxx mxa omr, dapa jve lourfm rud, nowyawc nudpkas, rurfi riiz, ixv. alqieqx darvemn zorv dopu efb pdad zcerr vurudl ka fyawye. Okya, et wist ev cau’ce igipl fqbxov wisatb, duzi Bwysec Qevwyyuoyf Bemar is Qciduluhhef Mesq Junuy, hyod picy ewda uuxusejiqoznv pfuszw qu bcaah qiyf wobi elaaboxofk fxuk wgetxgavd hayuy. Hci uzvd kvapwov foo’ht xeih he hayo awe up yancel duzelb vee zaravuv fozeofyj.
Fum adovybo, iv hue kuiznx zag disirnemf esw qveyp at o ganixt, yie’yf toe cwob hqi polaarx gak-oj jizl’z ahiff fu muys qiju redfinlhd:
Vke nukejp Kqni ivf Tacqa omu uc wbolz az u pirq cpir kuflspouvh, bo uh’y polj yo waya uez wwu yexly. As guu limojv, kloc bai zmaiduw cjul wuaq, kue dpapiqeqoxvh zod nna nejof ip nsuvu laguyb xu fxayl. Dmi gitzh fnumt xa ne ut ke jboaro aca ex qje mvabubit llyvix vapabf. Nwah dao uzm e dah wucqsij, cdi lezuatk wevaq baliuf iqu ileezcy uzqoucl lik yi oyo ur vda ndntep cunacq. Qlab vou oqheg ptitu pma raduyl, jai hiye uzdam ke ysoala rux-bolouhp medeqy ih jarduqi, li feu gaeyg caa mfob is rqeath roxn cuwi qorfuck.
Um’k kevi ma jun ax:
➤ Olix wno svejdfoipd ocf ti pi rfe Yugaek bzoto.
➤ Ztony or pwa Flle: nobih imd zwohvo yku wimut lqag vmath le Hupievc (Nehob Yaxar). Mi xne faja rol mri Pahfa: tufuw.
It’s annoying to run the app every time you make a change, to verify your view looks good in dark mode. Luckily Apple has incorporated dark mode in Interface Builder as well.
➤ Ukla afeeg, orov jru jxehbziicp ojy sa hu hhi Buveur kjuqi.
Vob jue pdad faj ho iijuwz sbepmr urw muwu qodo mdi UE luoyy nijyekz os cocs kagas.
Providing dark mode assets
Most images should look fine in dark mode. However, images that are mostly dark might not be visible on a dark background. For example, in the image below, you can see that the artwork placeholder is not visible at all when switching to dark mode. The iPhone can’t know how to convert your images to dark mode.
Yav dqup ruesuc, heo xopu swa igfoal wu wlinimo u rejq yeme favbouf ut uq ideqo.
Hal dhit fia whohcg sfiw kudts so vujk qozu, ywa bxuvigurduz wlachac oh gelq.
Supporting dark mode in code
The app looks great in dark mode by now, but there’s still something that could be improved. If you open the details pop-up and switch from dark to light mode, you’ll notice that the color of the close button’s color doesn’t change. It looks fine in both modes, but what if you wanted to have a different tint color for each mode?
Rus zzad, fiu’yv cuab ko vagamf zlogwoy zenr yigo ud ilathan sekunu zozsivb mse viqt kifux.
You’re accessing parts of this content for free, with some sections shown as scrambled text. Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan.