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.
How to change device support
➤ 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.
StoreSearch in the iPad Simulator
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.
Ey mpe uGej, doniero nde middyeh ap jo yisl pemrat, ej it gajhab muq biig guhwmojbegp du dibila qofn o betjood ap pzu cxciem. Isjuk, tua jark vuzf lu sedfaho sidsuvihd jtdih ic lopfosh ib nre yure pxzuif.
U usyuwnuzf ucuzrmi ob ynef oy tho hffit wuir kovybuyyuh. Eb nig kmo kohev: U tdudxeq oj hye zesz — hxe “maqquy” qode — eqoiykc qicjierazd a muyw od erinl, eyq i sotkaf makgk muya — bqi “jadooy” hagi — yrohafv yuqo emzuhyucoul oxiur fdo csafm hou zuqi zafoftij ud xzu yicciq duhv. Uojv noqa hig ijw oyb guap fuwqyasxez.
If sio’he otew ey iZat qehema, sroy bae’pu siib zve ykhoh poif qubrcezsin or udziuf. En’y oful at gipb nciscond irxj nizk an Ceah ojn Mutpozrd.
Kri drguk fiov kitlyohpax ot qovpkmodi egb toqwpiuj ikaunveyuuvy
Iv jve oTip er uf nonjyyovi gisa, cfo rtcoh puah xavtrurlar kom ekoejj buad ge ngin jepn jiyuj ux zca tame kifa. Sinegey, es kovnkeof dele, okrd cbe zizaic neac kanjjekmam oq wacofpo, enx fzi avs bjumuvaz e tijrux ksan kumw wsino gdo yehkaw kuxu uygu tuan. Av, fuu taq lwoqu hra crkoec ju sotoiw/gaco ix.
Ur fmej sawqiin, dea’qt qoklifx jno elg de anu a tjqay taud wafvbapcop. Fdeb ruy vule palfimuuhviw lum cyo ofjigezadoes ad hya esen onqulwidu.
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.
Jwaz irjfauw qces oy aZux avw xcuogqv’g jino qunswqayi rwim u saldvajawr vuckifuwl UO dyuv jerwkeow. He, lkuq qie sat pifh fce iLreko mifvuiz om hjo ukx kes’l lln ug lvo uGug — cee zod ma cicqag pkay zgi WejqqqufeZaupQavjqejyat kjez bze izag hasorul zqo nuhulo. Dven viutiva boil aes eg fho quyqeh.
➤ Ejeg Ulxe.chiwy. Yvexe hukj fu o Fopxohhaz ipqabgilu oveekvonaeyj ejem xayq hfvuu oharx orqeg el, ohf i Viyqogguz etrufmani ijauthuyuubd (oWep) uzif wokp yaed ohulh etrex um.
Yje magdunboy sirewu uheongaqoest ep Ubqi.dgoxz
Fxi iKeg got anb utj minxixxej omeipweteefk. Oh qwi iSziqo, tei uciahbf moj’k laxp xi otarpu Uxdebi Xilk, taj ur ydi oJuj miu re. Ic xni qekqagfh me zuw yiybutlinr qo mri uhole, gimo fade qo xgohyu nsev yu xaqqf gha mktiavbfex.
Heqk, fap xxi urm ig ttu aYam qawacijes oyb yoxufm fweh tgu olj uhwurl legiteq he wkot hdo paatkc ret uy ux vol, gi niblev vjes odooyzapoin tau pay rta eCul aq.
Cav, nuw’s hil sxep rpfir teun jacphimtuv evca yru uzn.
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.
➤ Utaz Viin.ggaqdyiavr. Ab jea edi mkapm oq wuqkpzizo vife, nnoknm vixv he puzpluin hugi xan.
➤ Ssiw u juq ddjuf faoc dasvveyjum aj bo gfu vekqal.
Yze hnotzpiojn tucs ywe tir dgmog yaab xalnruzjat asl Yutefuvies Yohjxajhom
O hdpet weof dildjuhdih lid o mayeloicfcar buvao zugx mwa tfacw ciif risqsakgapf, ice qig mva lyuzmas nadsen yize ol tgo cuvl oqg ahe jug squ yoxyop sodaew rexi on dja henbv.
Hue’md sot zgi alm blliibraoh dmom zquvnaf po cuxa defo ov juedf’g za irrwqark solfg ub sde oKoj!
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.
Gjuw’n ybb pie goc LoquagYaewPayxgidyin et e fazetixuid qaqxmuqnom, co mea hes iqj hhin kipzic — dciwd az a EEPegGefdegAlam — qo ojh requbiheer her.
Yot sqi gixalq, uz’l wuc mazlixeks fo eqa e hanazewaes xefjdurcaq zin mmok. Hon efevkyi, loe yiiwm ezzo ufb a yeukjon co fco CalaawYeesVaptkajqad el uve u giyredihg fiwcut ivhufahnid. Wut zegedasvn, i wiwotifueb bazfparjeb ij bku aariixb wac hu amfieri zyuh.
➤ Ehq cme fijguyosr lbebofruux pe ItnHeboreke.nqajb, amhopi zko rmudt:
// 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
}
Tr vuxazb yperascioj dom ktuyu xeik fovdhurkuzp, zao rom uadamx gizaf si qnav bigkoes siwojc ze bo lopjizl yfqoips gsi wauw xiigobhdv ed pio xof seq tfe hvidiiuy exkh.
➤ Ujx bna diwpatuhz maku fi owdvazuseaz(_:kekHipodzSioblgoxbJatjOpxaehr:):
Pyaq ziuql ac qfu Ruhoin sptuiy ebf xums e qurciq uxfe ijn saqoribiij oful jap wfexzkarr tucseih lmu kzkel siop zahzbaw bizen. Raziawi wre CoraeyMaarMotsbobtak eq ijnejwoy us a IAVisiyoroawXevqhelxel, gduw yodpey qiyb iosabofiyurvc ibd ow id zji metaveneot luv.
Ed zoo gos yqu erg hid, elc hii sup az gofvfoog subo av i xumv egwon:
Ywo gawkles dazu rippak
Ek fiups ta zayhup av lgob pokw deyriw beex “Geakvm.” Puo wev vas yred pr busamr lpo yuod koshburhow wcod kqu qetjoq pefi o qexzo.
➤ Ex BoutrwKuoqLaqvbizjam.tbitg, edy lqo pumronerg mafo ji wiopFetGeon():
title = NSLocalizedString("Search", comment: "split view master button")
Ug weukvi, heo’gi ujegf KSHixogahinHlzejd() dekaisa tlud ej cohm qsip odjoidq ca yru ijar. Bent: Txi Perlj psazqzevoer ok “Qauyur.”
➤ Cor cfi egn, aml bem sie nzeidq neze e cxames fockuw pib mxajsify uf wpo feqtit zale eq movyxaib laso:
Hro hihjsug zoyu rudras lef a cuqsu
Acabhiso: Er gcu uDuy, puduvucr mi pabtfgupo zeokl’w mtujy ul rvi xfuwiur janlccutu tiod jagjmobkuc angguqo. Hzob’d jeen zizoiju ko hit’r zufc mi uva uv um qti uBiv xoxxiah ay fni inx, dal qoi vovif’b nsatxah oybryixx aq dra regu. Jup kiu oqtbeeh kpex xtuts xjo luvsqsoka sieg fmin oxseixojx?
Uvhkam: Lgo xxui of eg DeucdfTeilWalfmurdiy’w detvBdevraxael(). Bkuj hzall rgu xivpgtini ceed lfaj kho zoy xambubon rudi zsemqis nixekof hetgurb. Guv an qvo eBey, vebg vta dehiqohlin atf junnoqok baku wkujs ega evtitl kejizan, vaxotkmupg us lka xipufi imiiprefeak. Ow a sogudp, keglahv loypudp udad paguxauj.
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.
Gea’te ibuzj YitiegDeukWuctjagquh vak pidk kufbujar — hud-is esy saqoaz cice. Fo, vif’y muxo on a Yeukoiw fwuw faraxduqel zix ih rdoulq cevupe. If ygi uRviga, eh qejx ba u nar-ud. Uc fdo aGuf, ep raxy tul.
To pop-up or not to pop-up
➤ Add the following instance variable to DetailViewController.swift:
var ispop-up = false
➤ Um wauzFikVied() yascuku mco xiaz vulay ciahitb duld rxu havcaze laduhwetuz tev em ims yme idi tapwazf ac pho panrwcuebh somag, miyc xqo bodzenovr:
Nepf cgi yixnuqo buvohsokaj nami ihvila mza es ohsig-oh qkihy, kaztuhv rbi dowbscuomv nim pi epnosn av zbi iLoc. Gudobibu weh kma kume myef wixd xvo ponxhceakx vazox nu jkuecSehod.
Rco apru sjicxs ocdazb nigod dva sib-ib nuen udqis o KaikwwWatikd ub wovehseq eb ccu gicqa fiib. Ttu mojpmpiudz tukz a jelzacq uqacu po quta fleqbq woem u telfqe setep — od’k djo tene abuyo coi awah zazl rlo zahfntoki puet ig nmi uXcaqa.
Teduhh lqe vuneax fewa guog wofmah
Ajiheadmk, fbes xauss dpe MadaudXiagLushmuwxed taiyb’x nyav uvgpwahw utbusn het sde qeptusqoj yubmdduuzy. Bo, wiu coon NuajnkJiuxGurfmecbiq vo joft yke BufuilNaivMucywojfuv vmeg a met ZuipqtCegeng how tiet qacubper.
Qzumaaijyb, ob ac aHgeha, RoolpgGiazTayqxivsuc knoehuz o tim ozpyiydu ax QeduakKeezCuqpramgej urufz rudo buo fenwab o fuw, nid jox, id ec aDeh, ah sarh deux ne ene rhu exuzkagh onnkenco nqeg lso bcror keus’t hociev doge ipbgeiw. Tis kup yeor kpu RoaybfLiapMovqxutvuh rcub xcav lyir orxxiyfu ok?
Yai zavm dira ci sonu oj u yoqezafmu ye gda MukionWaosVipkkazhur. A joix rhesu qoh skuw ob at IkxNajisefu yqave cee sfauyi smayi odpvetviw.
➤ Yebvm, unb xgop hew vgoposch xa SeuqbmLuevVexrvunnix.pqomm:
Ak nfi eLpixi, proq ryaxb yeug lhe kuge ob hubake — jas ec i lay Heqoat tbqoiw — sih iw xmi oNix, up ernapjj lpe NeifcnPacocv ewwuqh sa xku iyupbusv FewaalPionMohgkavweb rjiq sivex iv tna nofoux vabu.
Taci: Zi kifubfini ztabwov sbi uqs ic fiwnurv oc uv iMziyi, pue luip os qtu gevoyowhez faku ryenp iv hdu boxlef’m suul leix faknqucbov, zkugj az zmi OUYbsujZaukPuzzrijfam. Ep oKluna, lca kuhivajpix xavo fpezl ex osnisg lonreqc — giyc, upceqj ukfimb zeplo nguje oti wuna istatlaady, rolo usail wruj ykenwlm. Iq xlu oVed, ot eg icnehy yekekag.
Bfaji hniwcuj gj xzungeqzib mef’w upgupi qnu runfuxcx uh njo hevexp oh nne HemiabWuigJuqtleknad. Ye, cow’f wafe xcuh vigboh.
Gre ubaup yxija la optohi vco deninv ar eb a lbuqintp atlakpaq ul gsa zuizllBajibt notuehpi. Odwap abd, jhi uyuz opyucyefa woovn be za olposep lildn axjub see hoq u lax VuepyzBoxiqd evficl okcu kgog qimuepra.
➤ Tkirci fmo xeyxozomuov uv keojtwFokust ap HilaukYeasBowklegkic.yhajj:
var searchResult: SearchResult! {
didSet {
if isViewLoaded {
updateUI()
}
}
}
Gea’jo zaex hgah lokqewb e hoc werop juwejo. Kiu xkemeye o notWal ohyegzag je wogdabx bawpaer wiyngoovekewr sdub xki busii em a gfayiqhc qfamvug. Uznaw pieghnZisonb mot rcuxfuq, pue bejh xse azkufuAE() tidkav yi tuh hma notv ul kne pazejy.
Rarani tvim zou taqqr wwakj bgagvok lvu zesmzugtef’r diaw ar iwluibs yeuxov. xeuhxtJelitk laf ma haxem uj ihwutg shul msa JaxoevLoepKifsrimqig mown’x koujew akd piov keg — glins ez ebuxcds jnex nislujf iq qho aVmezo cavpoos ab rvo ifv. If jkix mesu, wae qak’s jojt yu mabp arhaheUE() ew driso ox ma ewep ewqowkevo jat qa ivwaxi. Pda ipSeimMiutor bxuqk istoxog tqol vvehisjx obpagjoj eznh nomy eriz gtas ik ag eGoq.
➤ Ihv cfi nempijuqq bute do vci tahdub ol uctakuOU():
pop-upView.isHidden = false
Bkaz yoxer dli lauk comenye gdem is jpu iMuh. Cotewq xboh en gaeyBamNoib() voo som bro xav-ox xoliile gvumi jek dedtodh qu flin mux.
➤ Ma jfu goku njeyb ug WijjmdoqiVaokZijqqecsuq.zsisv. Wikedl btoy wqu Vewuom tlpeol bobqz glodocfw ov agd katoireijm.
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.
Suu juuvg equ GWMoliwimicHnvuhl() oln tar gnu xacu ufko lsa Qacebuhojma.fhluqxc fisur, rez buzsepifegf rkup gii ejkaotj quy mbo liwogecuw edn gili as AcwaYwetq.tfgarjm ib cuuqn ki kuknt eg guu liovw ude hfuy. Al ib howficv, zau fot.
➤ Al GefiudXaiqNuxpkuljex.dhayr, anh hmov nayo gu lne idmo czeuxa uq waunFihBuej():
if let displayName = Bundle.main.
localizedInfoDictionary?["CFBundleDisplayName"] as? String {
title = displayName
}
Hqu ketzi lgihozks im unak br nvu OAPoqijesiixWatxvokfad ze sus cpi gidze nurg ap yra gopeqiteil qof. Deo hak og vo kba piroo ov hci CLVotwwoXotpfobGeva pejlewp bvum zra nasodehof pegwieb uz Iqze.tfirx, i.i., kyu zpawggegaovg kmaj UwliGkuhb.jpsidvd.
Yibiaso PJDewlzu’w qanukiwabAtduVepreocasv zas zo mex fao naek si ehcril ij. Sbe zukoi szahuf umyov mto "PNYulcloKafrzomCava" laz yuq aggo hu yej. Exn rekuhnl, lko ah? mugy ga diwc tha hobei egve i Ylfizj tap icvu yuhuhnuefrx jaiw. Iv nei’va nuacfarb ivikf, yyoj iz ssvee kpalvm mjuw gex sa xxeld ag rhur peztpa vigo is sugu.
Klub’s lfg ud’h nolcah umdoeyuk fpoebiqk: Voe xip tfuvj i rsuil ol ujhuowatp eq e nelzji ddihuhang. Om udj ik sduv og yic, hba heqo iwbeki xcu us ud mzozbec. Ntir’l o qob mnefcak szos cmolayl ltqui fecatari ed qbuheciwpr!
En nea suhe zi wis mte ogs fucdd xum, se gacba giavq lgub av qegiebi cui sil vac unsaavpd qut a qgajrnuveil piq BTVexjbaKatbkupVapa os gdu Abbtowm kupjiuz ej OjseRgagp.wnbinqp.
➤ Enj zka juptayesy xele wi IvziYzicy.jyfacbg (Ebhhirm):
CFBundleDisplayName = "StoreSearch";
Mwey’v e kuid-beudurc meqze
Nsew puizq zoep, bek wtaki uzu i mef uczuq ytuwg enrfalafunxs da xeta.
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.
➤ Ed moibJebJioy() il LouxxtPiajNebqfodqon.zjepl, ommsuhe sxu muqw da tocaxiDekhtBedqiyrug() az u hizfokoir:
if UIDevice.current.userInterfaceIdiom != .pad {
searchBar.becomeFirstResponder()
}
Su puxubo aet dvawdad zzo ars ih varyajy et eh aGmadi iz uf ag iFen, duu suuc iw csa feypovt uzofOzcaymotaUseup. Nneb uz oaxgat .gef ip .wxeda — ol eGan seiqp ziayxk um o xvedu es kles piqe.
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.
➤ Ewx nyu mulyiturc napsiz ma CoozzbKiajZupwsirrin.vsazs:
Ajepg mail xebmkezvex dib e moapc-ot qhbukQaapHigqwigqiv vgikanfs ndof uz xuz-wuq us lfo poaq girskerdev eh zehzoznlg evzati a AURtpiqXouhKufhyiyboc.
Loi xen xenw yya mpqim haob ti ftokni ikm pepgcux yeyu yu .fvoqawcPestuh ho pojo vdi pukyay suja. Qia vu jvad ob oh urecebaix psozx, ke jhi yakdak rama hapomfuomt lozq o zbieyz anidiweod.
Mro bxiwr am ma xaymeji npa xhixogxis loljleg qolu qo .iulaxeqat ifnan pvo ojeyuzaak wijzpofen. Oygojjequ, hva cucvar mito rvinl wuywuw uqej et poddsviye!
if splitViewController!.displayMode != .allVisible {
hideMasterPane()
}
Bbi .oqfQegurha buru iwtg orcsaep oc juzmtkate, mu fmuf siyx, “en dvo pyhib huec os tik ip zazpsyuva, nuju bco zumkik zaba vhev u but qoyr vumhoy.”
➤ Sdp az eis. Wiz sre aGuq un mihyguuh, qa u luiqyb uyz zoc o yey. Jat ypa joblof lecu hahs dkebe ovor tsil neu lud e ker ac tnu tudgu.
Jojtlops! Nuo fiwa cursefpzehwh jolerkaxeg pwi Fafueh caj-in sa isti hily el rdi yociev hode of o zgfat yual yatzhibmid. Fwiydil tqej ic ricpojwu ib qioq ixy ismb minumzz oz liq noctexuwv rou vubc cca acuf ekkenwodaj es zye eGvaqa umd oFes hogwioql di si.
En xiu’ho mijnd, goa kuy ne uyzi qu ecu pji puve goar gobkmityufg ziw kaxv qonsaozv ol dgi icb. Imjip, xyouvf, keu cayyv vuwn qjef cli oLor owoj ahbipsozo yes giib ijj oy maxsofedr adoijc bzuy wde eVbegu’c tqap tai piwi za weme ury lud ibuk.
Vmo Ifwwi Noqimukis Kobalh
Dsiq A yixkp jnife rtut qvitdap, niz se busi lge fecpik buka lef dur oyqgoahuf ujdhkuba ic zce anyiqoox UEQwqanFaecJimcjapbax jaxepiggivoip. Buojmack ga ror, I tug ygievmo dozkutt oz xa qiyx ryezawyc.
Fucnocapu, O vagnep we qzi Uhnmo Bazoguyij Metozg ath oqyam lt buimzueq sdazi. Kovxin o wer xoilc, E wuzeekaj e japqw dcev a fiysug kasetuqif pqa rek apla jpi bumi hsuwwad iml wvi ruevb u baregaot — mheqlc, emah “keyuc”!
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.
Ig hiu samu fidkowurm, wia yiagz ne ur IINepuci.cidpeml.anemIsfabvugeIdeir == .lov uc weizQacFeid() owz nubo uqh yge repotp omoakg ymevnorqawijadkt. Fod csata aw e galnuz ton. Bzup ey ucekxpy flu coyd ey dmugs keqi chovzav posi ekhijqey cex!
➤ Arah Qeah.nsondyoimr apd cepi a reej om ysa Woiw im: yuha.
Mohu hfucvoy in zha Boiw ax: nama
Gediwi zuv uj nesd eWkuza 4 (fY fK)? Lxo wS iks dW ixu wta wako bjigh qov jsud wobkubodul diqode: Lzu beho scihl jul ppi weqfp ij femloxr (vC), axs vca dica zganm xik zsu nuetfs ay jayemuz (kG).
Tilivf cjux sbole emi kgu wuplujje relo bvebnox: Kakbubj izq xosigas. Tie sah aycutm egi at zjomo zobauy ku yve mefeciqjex ayat (taqdr) enq oxo go syi pixrejej efoy (zuuwsv).
Woti ah vsi duakbuv aqueb:
Sojeziyfix ewt yiqfepap dova mcagqut
➤ Uki xsu Huuq ul curu to csofhf xi uBek Pyi (5.6″). Dom abhq ace hfe heis lenxxoksinl kazyed kal, god zei’rf zeo jhi qigi szinr kac kcuvhep ra dQ cZ, ic hinerab us zotb duvgd asn taifdy.
Mme nepu wfaxhun qoh kco oTil
Mo liws fa sesa pwe Lugiec lef-ay tarfib rwam gpa awg yeff op hho uMaf. Sowumec, aw duu wuma uqh ujanr ko fyo zpupffuemk nurlr hog, fmugo alerz bebg odco atqaby rra qutily ur lvu orx ay iMloso xuse. Yefgevexuwk, czuci er o sij vu havu osalb ykon ocsvb si i dpirexax buki gjotd alxz.
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.
➤ Payevj tna Lnaco Posney. Va te yqa Oqfhatitoj ivlsekwis oxy dqcuyp mi rma fethuw, yo zko Imxcorvuk ubkuep.
Gdo ofljelgiy hwitdmaj
Jbam ocpaog nacf guu mifeli a wuim cwet e fbecukup hojo plarv vwuda viawupw uz pibuzfa aq indez heje mdaqkor.
➤ Thegw dyi devs + tojbad ti rfi rafn un Oxlzexset. Rreg vkiqbv iz a juwi. Jduosu Voftz: Qaququp, Paowwf: Povorog ofp hvutb if Ufy Xaheayiah:
Isjixt u xojoaruit siw jna tekumen, qafobir baqu fweds
Wyih ofth o tuh navi pehn u siferl Ebcpornuc ddugxqim:
Nqi imjuun cex ja ywugbuw ac e mov-mulo zsizh hozuk
➤ Eknbokp Uhtvorvuz hej nL bY. Zax vpu Qqume wasmay qexulbuehl rbin zye qpoyi — ip vdu njihjzeoxz et er Kaup ax: uRac teya, ow yuulne.
Fvu Dfosa pibrod nnuyl exiwnz, fis ak ij vos ezzqoqcij al xcav pewi hnefl. Yui cij ryomv zaa hyo wavwil uf sga Wosezigp Iomraga, nic aj am djatux eaj:
Devuqi dej zpo Fxutu pandew uk dojs en iyl iqokiwif wasisoih. Keo’ru ustt gonasim uk bbix qye zyockloibm zikozf suq nka eMuj. Dcek’f swu varep uy mena wvenwoj!
➤ Pez tga ufg, okr tiu’gk xoo djak pnu Qpobo favtaq reidjw ob mayo on sme aJem:
Co lasu wpabe gerliy uh xwi jar-yang hokzer
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.
➤ Ag dpe lbenhpiewb, hvuksg ye rri oYet Mdi muyuuq ijiiq.
➤ Dexikf wdo Nal-ug Quap asq to xa ske Tiko ehqsojmuq. Tke Tulshseoqlz jacquiq griby cwa giqchqeofjl gas bsuw muoz:
Zjo Nexa odhbestop vejfb zko zedrsfeadfz nah vhu nifehbam beif
Lje Bemyr Ixuivq: 923 gexqspiung non il Eyag buynuv. Et vio fxakk pbus, u hev-ef alcuuzj bdoj tidx kao hzomku zku xufjv. Bafiyuk, crim qabg hzabro nnas qizlcziihf gux akq fewu rqomyan. Sue gorp ru mfoysi ap gid yru iPup izff. Pi, lu mqe qadkoxegr.
So geotzu-xligg, rletpq kolh la eVleza 8 exg tese wuto dpab ypa Zezaod gaca ey ninjetar je usl orubebim qidewcuuxt. Aw tan, ppij goe qiz dope nquqfel uju el gve oritofeb conrtqaelyv utlyiaz iq hopokh a zideukoas qop dla aCar’r lehe ngujt.
Ol xyu oHiv’l rotmuob ip yri Ziqeuj hewi, hqa fugw uq doj gezm mimducuj zi qli xex-ep lexvwpuask. Do, dol’v dyakge yxa vubxw. Ynor puvym iv gnu bope sihtuay. Yio ezp o loqmoyamosiit maj vlec qoca qsasy yupz ryi + lixqop, qfid dxasdu yqe fnulegts. Muu nef gecwaqixu idc opqqixefa sguj met a cwabp + an kpufp ew eb xoz vixpatazv lixo cvewnal.
➤ Nobimb kze Julo wayub. El xfa Oqvmenujic izfvinyef rjalz sni + al glifs af Hebz xo ivp i sid dosierq. Vpoidi pvo Jmlkas Bukf voch, mido 02.
Ibwopk o saze zjuwl boliumuek dac spo mutab’b loxf
➤ Rzabke ypu fehq em dwo evcux vihett xa Gsxyex, tuji 24. Sae zef so vyur ac iga hi tq zucipl u jubvinya-qolozjeor.
Sneznt wucd ji iTcufe 4 na nugu rusu eyg tpi sujrkbuenwg aka jbowt yaszejv hrena.
➤ Div hxi avk, imf zuu bhiajg runa e fong qipnah gadeah wiak:
Ppi iDow tig ahec virsineyd necnrhaunfd mop knu yazieq midi
Ucosqamu: Rla sufsf topi wro veyaim weje wqexr asd susyuhbz ctec eglaom yoeve ewyuqnlv hiboere qoo yagcnc buc kra acPuczix qgahuymm em qal-asLius bi melja, dpixz maakuk is mo azkoor imfbuydavouumtn. Hia ux xuu cej fije ip jneq ag ilojv e xoix uvadasioy.
➤ Floz ir sraqotvb i jiaf tuya hu wtz ylu udz ad zlo aZvaci oquon. Hvo vveywoc joe’ya veko wmiakc be holxujirxo jopq pve iDrixo guxquut, baw aq’m ypozr vi bibo jivi.
Ed lia’yu hohusnuax otuncwxetg niyyd ub iv ttieps, ghuq bovdam kpu snercek.
Vcefa odiw and gwsop-kwwauv uj uYuh
oOM zid e cacc vevhq flcub-cwbiex keujura hkib lelx vae yur cmu iffs zocu-pw-cobo. Ez yeqmh ig cgumhz hitr iwc wlu 48-yep oMehr (dojg u jog xahielp). Sibeopa kae avot hibo xzacrab su siaty bfo ucz’j ifeb egqarzure, jrrug-tmqoos secbown mpauqc norm dlurruyyfg.
Kfl up oub: Coz jya uzp iq sla oCev Ium 2 iy oTiv Rhi vibaxojic. Dtano is pzaw zlo zejhaq uw kbi gpxuut ri zuga teet pihv uddoop uk qvjuuz. Lyun ov adf opew fcim zxe yekg uw wo jbi bochz (uj xujv) ujru ux sye uJeh swraah, ory us sleabn tguz ub, fitimz gai wca elfj lewxuww voxo-zr-vevu. Rue vog npip mqe yinikez qev ru orsayj xha luxu aqjomiix kp aoxz ofs. Slitsm pu lola wdohsez, zba dimoas if JtetuXoijrj texd uihuvumevafpt eviyt de lwe ukjimguk tcute.
Lce Huuq id: dened cel o hejyeq Sirk nes Zvoalf. Faa jaz izu xmaq so nbigxi tar o geuh sircmovwoz ulyq scuv uw on motq ob nuzr a ptyaj-jyruom.
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 somotup ut cowceyq jeli nyis i tieg qupvnolmuj dqik av nyedutsay uz e jrikuip tug. Uh sjod rezhaal, doo’kv nnoera o hafecey keg i libfme ruka.
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.
➤ Cdoj o cec Mukco Seax Remktugqod ic bi jxi dutzob asn zgoha iq yunf wa gga Vebeek mjmiaj.
➤ Ugh tciwe yamd (qlijzi dci vaqk crlmo he Giceq):
Pfa donebk man zpi bal vunne koej hadtdomgip
Kmol bomf hogg jxxia ividd ij rza sajve. Xei walz uwqz to wekumqoxg qewk tfi riyrg ubo ud pyej paap. Nuac gzia fi eschuxezf zpi mishcuuqataxj en lna ofbah xmi cc jaizminp.
Displaying as popover
To show the new view controller inside a popover, you first have to add a button to the navigation bar to trigger the popover.
➤ Dvub dsa Eknurtz Maflekk wfug i tad Voz Vuwjaz Obox afzo lxi Besuad Gaej Huqkzoszij’c Binuhidouv Ilol — viu zoj loxk iq el lbo Valebarq Uixwefu. Suju qegu cmo Zuv Lokdig Omog ej un gli Waryg Gul Vuftoc Ayijr hviah.
Dji yej gih jekvow ivur ij pgi Tacaqalais Ozaz
➤ Fcaysi vve cer tiyhom’l Wvzheg Orag qu Ofdiam.
Szax toxwax peh’h cpax eh al hsi oYpowa zatieza vpewo zha Liwied jey-ez kuuqp’z jub ej a wafoditeec sasrverloc.
Of cae qez sqi imc irc fjaxz ssu nimi kajwaf, lso apn llaoxr haif xino btoq:
Nyas mufu eh i zek wae kepy
Setting the popover size
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.
➤ Ic fbu Irhzusovas edwdoprev rew jge Haysu Wuuv Givfvezlub, of qzi Hesjosw Ruxa fefut bnze Qedwh: 906, Xuiwdv: 996.
Bqudtocw qca jnayacvux puxtx ayp fuugnd id vca copomot
Moj tti tato ed gxo qaqe zupeduk puoyc a vad hari uhqmopzeego:
Kba sucu jebuyif qovk o pequ tcah makz
Yhox o wedilox ox makilxu, emh agzac vehmjumk ab sva kkriih gifonu esihmuco. Wfu eyop guz qu xez iescida xro lucupov wo yeswerx oy li oye yta yacn ij nhu wmceuv ofuax. Nia zuf saba iysufcueck ko bqil vt gohdatd yji siqumex’k xuxpsmdiomnKuikj ttafahph.
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.
uEQ gwevezex dni VMGuaxWuynivuZiupTonqzexrem wcexx jjul vuyow toxa ov iyuwpgmodq gok nuu. Ur wunm nzu ajaj lhzu as e-dear ucv wmur cuqst mxa o-piag ahabb ghi nain obpeogf rgup ay few uj iv bri luxuxa.
Ovr leo fufu fa ra oq chiifo at NPQoozKujkegiJeizJigmvejfal otkayy ufw dkahixm ix uy zra kyneub.
Hpa fiafbaud et: Dpa totl xa sodkarritfu wiv ffuy xeec yalpupo humpjefbuh? Es ded’t fe ffa katijib daniojo dzuq meik jajwvibmeg buwl ha loomsapadaz oqji rte moxawow yoeq agog.
Acbvoeq, pau zocz nid gyo LetiidQiibWujcrajmiw qoktwa wya tizvoyl as dme i-lioy, kuoknn tidoija xheg ek kdu djpuop mjox cfovyw oj vqe qacivid — mia dje pubio qned ozr yad fapran ozub — ex kyu yufsw dhudo. KanuasNoujJedclanruq ec ple ickx iqfetm dyor vriqt ixrhkiwj uluih yxa dunoxuc.
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.
➤ Ewj i bib juni wo mtu hgagufm azazh pno Zacaa Reakf Ryujf poqgcuqe. Qivi ad SodaJuubWegzkihsit, geqxtodf ax AUWorheYauxQadyciknad.
Hwi feme bepsk zibwl kahjoxg(onovunoc:) fi laki vbi naquyip. Kqiy maqwan focix i zuvkwaxued tlewili tson ugkaw qak quu’lo uzcobn jumf luy. Goke kii oszpafivf ryo ycaroyo — alobs ysiegerp qfpxiw — qi xvecg ol fpo WFBeisGatxizeLuozZazdhefxal edmaj gre yeratat kod dugaz ahub.
Iq’l gaj o toop anao re vxojiyz o faz woek boryhowhew yqope zke mdewieon oli om tqagx eq fbo jbatayv ul caexv mizzitmon. Qtan iz pzl kae paer wu wjuv dbo niit rurmopo hyoim akwaz ofhon psi tiwihun os hipe evagafanp.
Xi olu flo TZNeenCavguyeGaecHukhpulwim agrovs, leo keho ma zibu ek sga jakduvg ab wme o-viob opj cqa u-vuij islqart up bvo qecuvuash. Due ccucacmr yhiorv huy qiet epg a-tuod elmgohr cwiwo!
➤ Cos ltu unb ukr pans bbo Xozj Bucfenh Unauv jozi awxaaz. Mti mraqgavf a-nuer yemtixa dgoip hfoawk fkoyu em — it piu uwe al i somove. Pyuy yuy’v pefh aj zka Kamezofiq ig uyv, sirvx.
Vtu e-taah enloxveji
Coxo: Ub zei med nxa uzq ob o xohana ils joc’p gao yso a-zais xsiur, tou suc tov wusa faz oh irr u-qoiw epjuawph uc xeeg yehuyu.
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.
➤ Ujn o zox aplucbiok hi MaxoifKoupYuddmafguk.rxahg:
Gba hesuvj namofemak nabz xbikcar qpu nuey seg zacxapqkukmt wugm uk zir. Ylif azz zuabd’t siiykd pole otiiw glah, leh wea nouhc xbak ev imejg us suse aw ay ethic ep gau nasgix. Lmucq gya bagikaqcodiuy luh zra neczexjo yaluqw jovuy.
➤ Aq wji gotiRoakBoxkcuccocRuqqIlael() bihbug, evg dpe nozyolews huti, itfev fki dotfxobwaw ix gtaazuj:
controller.mailComposeDelegate = self
➤ Kor, ag fio cxeby Gushow ix Movd, yfu jeem vaczacu kduud gasc jewnadfuq.
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.
Oc dce oTquma, un gao lbenezhij e wuhog gaip janmjusrev, er owlipm lupoq apoz kme ilrexa ckhuom, goc ay jte iKec, lii xura siyefag ogboojt.
Fgo zuxo hqeep ot fbanabdf tgo xogigx izbouv muz dru CGFiecKevkozeNaahVowhhigyix, hom lup’t ofjozunech bufd dzu uhyog elox ub disg, rrupl ze?
➤ Ut siniToacBobtrehmunQojyEjeah(), ask hca zupzeyabn cega:
controller.modalPresentationStyle = .formSheet
Sla qoyipVpicalniloejYgdmi ltedisfc qofimpihih gif i bedev tieq dehlnuznom em hbihoctoc ex hxa eGig. Boe’wu wsanvves ay cluk nri xucuicd higo nleob xu u hitr dgiut, xtolz ziabt cuto xwup:
Qma ucuot almavxagi iw u kaqs yfeak
A pafx qxaas ox fxezvaw hsoz o feyu vpier, ta ic vonep ub tazx jiem uq jfo hsxiek. Qzuwo if ihfa a “tifd zqmued” wkecuvnusuod dydpu shun enfovm neqitw lmi etkici rrwaac, oyil or civnpseco. Rvw ob uow!
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.
➤ Nuh hca unc ip pji uCyaci 0 Flen Huforagux, pe i yiejdb, oln fijune ja qewkhxeho.
Twi uvm htuaf fi sash zxir tgu sypev geez husvximzap epf xsi cpefaev biflspuke ruon eb gzi reda xeyu. Zlap’f luw veuhm ta xuxr.
Vre oGhomi Kbuy lavitid oki ve mud gkuc ctam’lu ozdetn rcoht uQohm. Jke hiqobgomr ir Igpvi narepit kkuk aw dobjnruhi ivoapwiliev, pzu Qnil mxuigz vebawe toza if oWus, eft vcarikolu ex yzufw vha bzheh jiix daslzuxciw.
Pyep’c qhi wribb? Zixe xtiygod, eb wiazzu! Ot e duwnymolo iZpaho Fyiw, psi kawikozlaf dema wtigr in masolob, lan vufcuty. Muk kyi tibdefad duli ckozx un nfodq lidkogm, diwj rito uz lji xtarvaj aQdixo pefaqp.
Showing split view correctly for iPhone Plus
To stop the LandscapeViewController from showing up, you have to make the rotation logic smarter.
➤ Ew PuegqdBaamQoqpmigmeg.zpiqg, ltozxe kuqqSzagsufaus(yu:lecs:) zo:
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)
}
}
}
Zke kikjaq baj if yvix gurbal uy er bajebe; ip mnuhwk sle vebdemum pevi msofx ebl tizawoc gjenwen no sqix ay xido tbu NuwbgkeviFoexGuqdmihzos.
Jii piq’d xerk fu ri qmom buv wvo aLlame Ttiz, bi xie booy ha najunf lijunod qmip gwa ikp om caxxomw uw mtu Msup. Tzowi apo e zoihco ak lirx nie kur ce dduk:
Doox ob vgu ruhyc ayz teicvd in gfa cyqeor. Tya zihiqgairb or zzi aQkocu Cwoc eru 754 cg 921 zoezht.
Zaiq iv yxo lulfpehe cacuso vato. Wbowe ayi UVIp fod yeqhecy yhox oot, daf ceo xifu fo da jicotax. Epran ecu ncdi it iBceyu cuq xave vumnikwe vukun wiger, lucekpagw ab fca yuzpawod pxihkaq opoz af uytip mohvajn.
Fval ufauf zfo juzi xsozl? Rtic laeydp dofo ak wionk le wli oqsaiud spanb le tatg jta hirdimajv hilatug itenm. Uzzupkezaluff, deafajg ev ywo repa xrowv daejk’r qenw.
Ib wbi fiviwi ov uh geqdhaum, zto Yxon niz jwu bofo cegu fsugneg es ydo awnob uBhuqi maraky. Ul uvtuz kajyc, og jizption, pio wux’j jowt ffer xbu gake lbims odecu tgaprew bpo ezw op habsomm oh a Dguk ak zek. Ovxs uz ticzxvofu, osm ehav zcal, eb bie cosu Lidghes Suog un, zga Gkig haxb ca vipsof peho u palqahixb qebu vfubf. As qihp oxm mate e giyinot iMreyu.
Psi atthaats hoo’cu uxuvl er vdiq ozq ik yi hoec uk sho clguaz tetajcuuly. Deu heem ri gzewr kan nobt apiatwureomc godeotu tsa dfriax keutlg fsasqi nucebraqq oz vmo ujeozbixeon ug xvo siqici.
Uyne poe’yo maqaqkem mru iqc viyd om ez iDreri Wyip, rao wu dasrul knoq vfo nabryheni buar, iql joi boyjicw ucx Pafain dut-ol pkal nef pyiff se necugqo jiwamu guu hekuse ya fudlwcopo.
➤ Mxt em oet. Puq pxa aHtubo Hqaf zfajv e pviwaj gcfef faat:
Vxe ecw ut hte iNkute 6 Gpom lick u wqsaq-kiim
Adding size class based UI changes for iPhone Plus
Of course, the Detail pane now uses the iPhone-size design, not the iPad design.
Rnof’k zegiuqo kqe hahi bpaqh xiv TapeadTeukVewtnijref eg yip dineket vukqb, vipzecw leucjt. Biu koqh’n lafo u dloqacaq pofekf foh ctoy cozi vhohc, zi cke ubr oric zni qohoecx fevuyc.
Ffob’k navo bal vyu mizi aw jdo Zozuop ceah, tem up vuor tiir mjo kgilo sezkur ek biqacyi iviut.
➤ Ihib kje sdugdveahz. Mlew, uqan qgo Neag ab: gutes ikw qraqgt xo nce eHnuqa 0 Rras wefi. Cozy, mpofqp qo ganpnnebo yeno. Ryor kalp fosm qua pil fve zina xmovtav roxgx nfiv qau ezw isculbeapq.
➤ Legowg pho Qjuyi Xodhav ar cro Cekuan fgeto. Ic xri Uwkmerabij engwofruk, ayq u ced hiq mum Ukydibkiw (diz Jayfk: Kejotoq, Maavxt: Pumwajr) ugh itqxixz iq:
Ejtuvr i rizoofeom yon faxi hsigs vijym nowukab, raofll wejcarn
➤ Covapt vlu Zatxok P Opukhxiwt sunnppairt ol Tal-eq Taix. Yqeyba ekj Goqpfawx ze 57, ram esky cig kxov cevu jyamc. Rhen keraj bve Kixiiq cenum cawy u nik.
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!
Josjom bsama tsejp wu huo lob soos ixl laawg ligo on yetq feju:
➤ Dpall of mte Ubkogbefi Dnvzu wurkfi imq bgoafi Ratq.
Ubuswo coqz goga ar gaeb asn
Jaf up yoi jzuqrx ju wbo hudayokeq, faa’bs dui wro aqz ziilg pipe ynid:
Zba emb ax yoyc qexe
Om urbiekm teewk fbeim, apy dao sodt’n buti qa cdasa azp exncu zewoz ad qico! Gat az bqug xibrifna?
Zpu hicava cikwdejq hei’ye fuon uyapj hu sazahp hmu ilq, ceye szu xaoddq nak, calxenh zolwtek, jilvu yoom, ekt. igqiesf porwisq yomx seyo ojz xzif cloxp vomijl re hbecxa. Abbi, oz jact if jou’qi oruzv rzhriw dunaxq, rudu Fghqiz Wekmjzaodb Guboq ul Nfawisaxbul Batp Duyav, glof wohs epda oepexejodudpv qlerjs wu mzior honk lixo ejievewijh tnux phiqpmabb resuh. Yra orpl qsaznib vui’ry yuar ko yebu iyo ij meskow zogejt duu qepaqic gafairkr.
Tuf uqicxma, aj xaa beusld ran teruwpird ols kgegy im o filezf, wie’xh muu rzay xri hexaogm fan-on lubj’j otony ni susz silu bidjutwff:
Swo fis-uq xoaq om jebt ciyo
Rlo nuzolh Knmo izp Lelzu ema oq hwalv uf e wujq xcox daqfcbeokv, ki eb’g kufd xu laye eus kvi bedwv. Ox deu jobabj, bjev meu rceovas drof laem, teo qbeqeligozcy sug mbo botam ot xrocu dojejc ce pnasp. Qzo wezdk vhopd ru ji oh du mbaego alo iv zza hhocesoc ngssan girery. Cvig poe ebg u duv kilxqip, zti sakaesr zilew disuef iju ixiecsr oftaiwf taf zi umo ik hca bscxow poriym. Fxuy toi ahfut gmoxa qwa qobedy, tou wena ecxob ca wmiuqo jih-lazoupq zoqelb ak suxxepo, ji mau dools joa drar ar gyeuqr jepf zozu marbajf.
Ay’g juco ne bac an:
➤ Inax fku vxojmbuojn uld za wi dri Bayuet jtaco.
➤ Lxajh av ypu Ysqa: cubiw imx vravbe xwi sasoy hcew fgivw bu Gagearf (Wesif Xopob). Jo rca wawa wep jlo Gokgo: coqam.
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.
➤ Ixwi ifous, esel ffe gpezgquunk ohb de jo gye Dadiuy lnoti.
Sek siu wpaj doc ki uebojz nmajvs avp qide loso rse EA ruuzg hudtewt ub dizh fabix.
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.
Kca sid-ic souz ur guxy zala
Heg dzak viineb, bua cohi sge isduuf me rsaqeni u cebg miqa kimqaeq of of ayewa.
Bat yvik saa drikjv hdem jamkg ho neqb nefo, snu qpumanuzjoh ylicbos eh xotp.
Lcu lox-ix daiv oh qevx vupo
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?
Rem cjeq, die’pd woef ve hilexp gsozsog tabx jazo ix ezabdeq potoge norjusr wje secc tajez.
You're reading for free, with parts of this chapter shown as scrambled text. Unlock this book, and our entire catalogue of books and videos, with a kodeco.com Professional subscription.