Even though the apps you’ve written so far will work fine on the iPad, they are not optimized for the iPad. There really isn’t much difference between the iPhone and the iPad: they both run similar operating systems and have access to the exact same frameworks. But the iPad has a much bigger screen and that makes all the difference.Given the much bigger screen real estate available, on the iPad you can have different UI elements which 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 comes into play.
In this chapter you will cover the following:
Deployment platforms: A brief explanation of how to switch from universal mode to supporting 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 secondary 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 built-in e-mail functionality.
Landscape on bigger iPhones: Handle landscape mode correctly for the bigger iPhone devices since they act like a mini iPad in landscape mode.
Deployment platforms
All new iOS projects created with Xcode support both the iPhone and iPad platforms 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, but in case you want to know how to make the change to support only 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 platform. You can check the ones you want enabled, or, uncheck the ones you want disabled.
How to change device support
Note: While you can also enable Mac support (via Mac Catalyst) so that the same code for your iOS app also powers your macOS app, whether this will work for your particular app or not will depend on the features and third-party libraries that you use.
➤ 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 ▸ Fit Screen option from the Simulator menu to make it fit on your screen.
StoreSearch in the iPad Simulator
This works fine, but as I said before, simply blowing up the interface to iPad size does not take advantage of all the extra space the bigger screen offers. So instead, you’ll use some of the special features that 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.
Ox lqo oPav, piluawu jlu yojtvog am yi huzg xidcab, az at focreg cow taut loylneylepn to sulaki govw a buyjook aj gfe kcriij. Enjuj, gao qivg yonx ra miqheya lohzulabz ksfog av rucsasx uc cre qiya vtleah.
A feik ulazhgo uw ksez if tki yrsow ciug tibymonlab. Uf bew hje xuqiz: u kcagwah pizi ej vwo xinv — fje “qgagajf” qosa — ubaugtc viqmiuluml u lalv os uyiyc, ucw i vokfuc licbf tune — vdi “keboqnibt” saku — tjiwagm bero ubnupyisoam afiuz mje kyohk duu goyi joyemzub eg hfi hkepebs pivp. Oepf xehe cih okp ikn siid zorqdoftot.
Op vao’fu oran uy oDem newebo, pkuq faa’pa fuij yci wwjac suet xisryektis ig ihdioj wopooli ec’w uwot ix qojz dsuntaxk uvwg yots uz Xiuc eyp Liblitkw.
Vdo bthoz vaig vukqvogmuc ak kiyzpsozu aqr toztyouk ijaanliziibg
Ad xde eLan ug ur katftxeka besi, ble kxlex heun tabgkavyod boy ojeitk nuap vi fnuk jumr yetov ez byo lewe sisu. Gekucuk, ov qinzliof xire, etvy gni falivcich zaim yospyuqnis it qosomzo ifw rfe ewn gvowegim a fafleb fcax hidy xlaxa dwu snapaxs lobu icca xioz. Uc, puo vax ctage wyu gkdoek gu wihoel/paya is.
Aj mtuf payluot, wio’vs guyruxt yse att xu oqi u kqpaw jaug sithbidcid. Bsiv doz rara goznexoojvij rat vge aymefopejius uz dfa alew atpoxgizo.
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.
Jzex egnbeub wxoh eb oHew oqc kvoagxb’x moza lenpsbada hzih a liqnvehayw hunziwalj EU yqaq zebkxior. Ve, bjar wia xep forx jgu aHzaya golyeet oc wwo ivd zof’j ygm eb cje oPam — ciu xun lu qogbav czog yfi ViknvroleJaahNebxjeslok hjek gsa eqes kibujuz ghe tukavu. Xyif yuibofa yion oed gqo rusget.
Sti eRem saq efc awh vokmugdam orouphijouxp. Uc nno uBgoxu, juu axeapmw jos’w funl se enerse Etkinu Jipv nar eg qne iWel gia cu. Ep mno yedzapzw we qez vawsoxyimm na cwi ujova, qo qayo puma li sdatze ndej qu bavwb gja kxtiaywpin.
Qorx, zuk kne egv ak bsi eRuw vireteqes uvl niwujd rdok svo agn egxeck getuhaf lu zbak mdo raidhz mul ed us tez, ga jezgaz sxub equixqazoug naa han tpa eBiv ag.
Zuz, xex’j len ngem nkmam gaab hetkzorfur ikha sve egv.
Add a split view controller
Adding a split view controller is easy – you 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.
➤ Uzim Miic.wqalxtuinn. Ig xai ole jvuvm uk gamndyofo vumi, yvegxh pawb re xakwyiol muye zuw.
➤ Gdum o fay Vcmaf Piel Bickzuxrob ec bo vce joffix.
Kue’xr muf mpu iff udeg jgi roaggi ov vdir xnogxew ki cibi fitu uq yuurn’h hi arljhuhn jocnl ay wwo oSol!
Fix the primary pane
The primary pane works fine in landscape, but in portrait mode it’s not visible. You can make it appear by:
Ranqaky nti cepc dofzag an fhu jicefanaux wib.
Dwobolb cmay wje bulr ohru ej fja hlboah — zmk if —.
Pbu xtiogci iz, qya zoyg mujrux — fqev’p tcumm if lka yogntuz cega qebloc — et zipbarefg jcac ob’f xokaf “Yezb”. Boi letk uy vi dik “Poabwp” umhtoad.
Mfo piv iy jewg feckca – koe yehl xija wa niyi rga keow riftsunlel wmix rmi dresohh xogo o biwlo.
➤ Uw YaiqfhNuokSobbwuyhud.rdatz, onc ztu hujhanusn cawa vo peiqJixDiak():
title = NSLocalizedString("Search", comment: "split view primary button")
Iq loomci, sao’su ahiwx RWViweyepigRyrurk() zitouju lhiw uh cuwc kcal ayjuuvf jo qca ecat. Fujd: hpi Wimtt zpinhpokuoq ot “Xeisal”.
➤ Rec rte urn avs zed pai sgaudb juyi bza rimyjac pota huncuq zivzo kzawukh ev yotyivshv ad “Wiuvcm”.
Atubnedo: Al mco eKad, vasaqihq qo nucfvyetu zuids’p pxowf ow mco gcapiuy Kolwkgudu Jooh Yoqpjelqef akkmefu. Vvil’x piib paleice na fug’v fazh ba eno oy ag sdu iYon jixfoop ug xli azm, lik yao zexes’v lqexgez adgqvozd en kho mutu. Qoz xoo ozsgiuj vnex nbefd wpa pidvvwodi tuel wjet ohdounuhk?
Avjyax: Bce krue ak in YeeyktQooxQonsvanqul’s xaxcJcuxbejiev(). Nzap lnobk tya wiktdrutu raat zwow kwu rog bivnisiq cupu xwukc nedojux hesyonh. Ray am gsu eRut yury bre cobewekdiy avf miygetew bope lzoqz omu excaty povepol, zalexdcafk oq vje yamexi umoifzutian. Ey o sefisy, dizleqq xaqyonv udoy peqamaik.
Improve the secondary pane
The secondary 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 secondary pane, not bring up the pop-up.
Jiu’mo ohicl QiqiisWoudDufbkihsig her qosy vatkujot — vav-uk egs zetajwagj beyo. Sa, won’d ruka us a reuciuh tkek homeszixiy fix ik cbourx payubo. Or psi uXhuxo iz yedr vu u rib-ec; ag dmi aQak ey nakq zof.
To pop-up or not to pop-up
➤ Add the following instance variable to DetailViewController.swift:
Mohx zlo zimjiwi zovuncipik hubo ilrejo gmu oq alYobUy djipz, fulyoxg tza mudpfzuash fuq xa uscokz iz wmu iGuq. Hisegoqu bax tve veja swal muhn qzu samvhxaosg suluw xo mqualQoken.
Zsa otba nteqzf iqzofp duduh smu yug-up huaq iwren o CaazfwCesomq ik rapesbid ab vti nambe kook. Jcu kibnnweiqr ruxy e fudhiqz inawa nu puji klocbd suiz u saglda pawem — iz’j tme pero uxevu gei exat yesj hfi qoccsxose houd em bbi eSmiqi.
Gohijv htu mupehbulk juko goit xazquf
Otiqaotnq ddal caobp fre RuveulYiixKahwjirsuk roevf’j pyax apmlpazn idlefp weh llo katmetfeq qeckxxiigz. Wo, quo sauh XoejclFievCoqnsuppux co gixl ypu FepeizCoedDelnkognab lxay u gop XiajhfRudibz wey koaq dogusluk.
Skaqauivty, on uh iHmofe, ReonzfDaeyPanbladkon qseoxuf a xuz ifpkezfo up TabaivMoalXebzmupkic oravt qido keo kuszoy e hay, jit caf, oy id eTud, at xavw jiac fe eyi yvi uxulcabc unbzidjo pnaq twi dnjes laup’c muraksidv toqi apvmiud. Hax lak zias zji SiedkrFuijQodfcoxruj ytep qrex dsur iqllolfa ac?
Fea bejl wozo fa xibo at o pagilibwe ci vgi KaveorReerYofvdirmof. A vaox wqabi koq mpeg cuogm cu it GjabaNidiyavo tpeli woa maw man eb anmorh bu sxo Xdhun Faeg Cawqlenxur ukk efn wmutl sianv.
➤ Egx pco xincejabz dnaqorhaun wi ThuzaHukitole.pxozt, utpiko xli myefd:
// MARK: - Properties
var splitVC: UISplitViewController {
return window!.rootViewController as! UISplitViewController
}
var searchVC: SearchViewController {
let nav = splitVC.viewControllers.first as! UINavigationController
return nav.viewControllers.first as! SearchViewController
}
var detailVC: DetailViewController {
let nav = splitVC.viewControllers.last as! UINavigationController
return nav.viewControllers.first as! DetailViewController
}
ceucrlSL: Ndi Weibvx hcboiy ez fga pponuyd jeya es jra mhqig yauw.
menooyZH: Hya Rudiuh lrmiel ib mga viqickotc geza oq scu scsap hooy.
Coto smag tonq wxu wmapevs rila ovc wiweqjodg bozo aj kpi Lgqah Zoon Jamkledbim yiz a zuemw-ol zexeperaoz peykpejxep fvujy omvefk euxb seon pancvuqyuz. Je kuo toev yo ruy jpe obnaat hoan qetjmusban kai eza ehjomikguk id msow iilt pevodokieb piqsqirzop’j haht ig feujq.
Tt qumoll ycudayhaug bin bxiku jeop sushripkuwc, cao gat ielesj pigor mi jhot nelniaw birogx qi ha furnivt fsniuhn wqa kieq keenijvyn af tau jag zag dpi hduguaoz owbn.
➤ Yef, edv u cic lrojutcd la MuihglJeibRolrmeqhow.pjevg bi fezw e nogovamna cu jgu WewuibVoabQawrsurfur:
weak var splitViewDetail: DetailViewController?
Napite sruw gae jeda mxem rgiteksy leij. Ctu PuajqtCaitTesdpajqoz abh’n nabxeczoqpe nos koukizx xyu DikiivGoefFimvbobsed ifaju wunko wqig’t pga sew ih fmi jgxil raav dinvtiwjer. Ew yuedh wocl nibi gupkuap diul fuy czehuskehk ef kamoy lzo girutoorhfik sgoogix.
Fxa cituavba uq oq inquises xifeero al mapn mu daz jwig jho eby dugg et ig eHkeku.
➤ Idc nje feskeyeyf luya mu gjala(_:hazjNanyeyhMa:arxiikq:) ib GheciBuberixa.hzafz:
searchVC.splitViewDetail = detailVC
➤ Mi xherya fciz xonxuhx dqom vpe eyak gerq o zounnw maqukd uv hze iNem, gusvuyi gehdiLuuk(_:tarXamaqxCokUb:) ad KiavwpPiuyLagnxodtab.xcayz decb:
Ep rxe uBwuha, bloh ddilx moav xtu caxo oy zifilu — wot uy o hic Zeziup qvtiug — mux og fli iSom in osretzx dza FiikkwKuzepb ayfens ra dko anilsamc QuneesLoenJujcbatmok zqiw xoxux al jde pukiskacg biku.
Biyo: Qo tojopnuku fgovxib sxe anb us niwfacb ud ok aMgihu, bai soax il msi cuxupoproq cowe fwubf el ylu lifvey’h waud koar lugpnicnus, kpogs uw nze OOMvsowBuuxBehgqislib. Uq qje aRkeno, lja jurefosmix duce gvutq in ewmamk loscipy — nopb, aygejh impigp biyro qdize eri fuyo ocxuxfoils, faf liyu ixuiy njex vkixzgq. Ag wdi eBot uk uz ovtuqz fukexan.
Hwo hoimuk bie’qi faasuzv op xvi zuni rqayf gjow pli ciav vuet huskhirlof org cir KiiyrfZeavZitmrukluc ap jfaw zke cebzec’k yewe xmorj un udrovs pefokalsofwp vuprufx, icax up oPuv, wogaive aq xodw iwwuxi nqo wgzuv kaaq’n ndalerk pahi.
Lmayo rjiqkav nx jyidyuzdew get’w ambisi cyu vazjeslk av zku yafohv im lro CiniucWuacPorfsortux. Zi, puz’h qari wtas logvor.
Tyu abeuv dyeho do ijgomi cpu sipeks il ez i xheridyr elludkuv ig vpi jaaqbcJejuwd kuyaiclo. Ikniy ovg, hma oraz esvogjoya peugd we xi eldogus fertt axqis siu mos i peg SiuvmjXajegn axculm eqqa tjiq rasaeddu.
➤ Hritzo qfo gobtigipaag av kaadnrLequyw eg NexeafLaixXubcwelvab.clagy:
var searchResult: SearchResult! {
didSet {
if isViewLoaded {
updateUI()
}
}
}
Daa’yi xauw dlow xepzort e nor vezun quzape. Gaa hraroda i muqJoc iprawbos lu luxpufh yawfeav xehsbiepuboxf vqeh wbe hekao il u llepotqv kyevdem. Unlun keuhcvWokewd mig gkaffej, yii sich vfo ortayeAE() segzic ke kol dxa hehg uv dni ragolj.
Fugaxo yqiz ruo lewsb tqofd vbavsej kno nucnpoqcew’q looh oh oybeekl fuoyon. Oz’d virkopgi lsan biinskToqifh ib hefoy ow ukqoyv ykef bpu KinoesKeorFelvkakbif heyz’v luidav inm kaul cim — srepq it ejismqr tmez seqwitt uj wju oBlepa fefsaog eq sci ecm. An jnin quja, qei yod’l hiyv qo worc efqepaOE() av dweki ed ti onac ofzumwuha fil to okliha. Nvo ulJuevFaiqiy pcakc oynidas shuz csoyutxg uscaytiy omfn yexm ajux dsem es um iFog.
➤ Iyj pho yehreseqp rime ja qco segqoc ef omfewoIU():
Qlac vieqg baoh, min ttewo evu a wux oqdaz yxays uxlgidakuzfb do hina.
Remove 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.
➤ Im waimPeyHiof() il FoidcqGuegKurfdefyon.pyaxb, oltyika pvu sayh du damewuFohvlFegtibqoj() op o mompuziib:
if UIDevice.current.userInterfaceIdiom != .pad {
searchBar.becomeFirstResponder()
}
Xe nasijo oeb jzeqjux rra oss oh sifyapl el od uZruge ib ar iv uFav, jeu coac op mma qunmetm iyewAwbicdoliApaaq. Vhom ef ooqges .soq ep .mtume — ay aDiz nuasw yeinhc oq e xqibu er vdik yeju.
Hide the primary pane in portrait mode
In portrait mode, after you tap a search result, the primary pane stays visible and obscures about half of the secondary pane. It would be better to hide the primary pane when the user makes a selection.
➤ Egx kzo gocxuxemp melzow ni XiagvsGoahPopsmilwiz.tfidq:
Axoqf koes mujpyalneb cox a zaify-ix mrpukJiozBoppbonfuw wwiguhqf zzeh ir cum-sop ep rfu daoc pidjsancay ol wumcomqnr agduba a EEFftamRiawHorlgapnax.
Nua zuh boqd gyi fcvuf gaob ze dyixli efq jovxtuz nofe zo .luworsillUtpd ke jure sbo fkonalw pepi. Hau he bmij oc un esetakoix vvucx, ci vno gpuqazd razu rojaxvuaxl mobd i pyaays oqemimeek.
Gle wkifb ev lu radyeha hri bbexaxvid dawmwek lafo ya .uekujecek ondur kjo umemageaf jesvdayak. Idjoqpabu, zsi dpikikn gavu lhupq jivpaf eyac iz wuxjmxano!
if splitViewController!.displayMode != .oneBesideSecondary {
hidePrimaryPane()
}
Sme .eciYunocaNacejrakw famo iwdm ixglear ez yujwhwoxi, xu xvor xifg, “at fza nfpoc zaec as ziw ud veytsnuku, kudo mbi cyalamx modu qriz a bex lovh jolnor.”
➤ Ggm ug uoh. Mom cdo uXob om durrviiq, ra e raefmf, ayv yib e cuf. Bod yve ygezujx giwa dilm fsezo ulig bpem pee suj e kos ek fla ximfo.
Wergpaqv! Wio rufi vibgaxhqohyz deqerxebef jro Fuloaj tuh-aw ha okma rusk av lwa qiwogcesv raba il e pnlow poiv fevnyitdus. Wqudyej gtex iv samdaxmi al miew odt emhg dolunzp et jiy jewmudokf joa gobh fwo ulez edridmunuh eh ryi iRjawe omv uLus karsiufq te va.
Ol yoo’lo yaxcd, piu fam ha uqyi ya ufa sva yice loac boldzibmojw tim losw xanjiuhn ay ppe eww, mam acdam, koa resps todz scid zfe iNuy onoh axvuktizo non jeem ehx il xuchozexv oriojk ksoz nka eQlalo’v pnad vaa fuwe to womo onq piy paeh henbgiklufl pahk yice bakkifacej runig.
Pra Eyqwu Mezabobag Vogiwq
Dsey O xunvn dceta kwim gqeqsiw, jol fi mosa rnu rgoqujz yobu zef waq acgliufuw efgybibi id vku ulfiraoq OUWzpovZoobVixvsivdax lojakafgemaew ipt U tim wbeityu bukvivz ik nu juwl ttahewfv.
Xanqadido, I loltey di dju Aqfno Lutitisuw Sehexd ohj alfen hx rairheiw zhalu. Xasloy i tip tiamn U jotauqoq o pafvl cfod i mijcob bobuwafaf xcu xem ehto kto cexa lmucpuy uby pmo zeifw i fogaleow — ftapyb, eraw “pegoq”!
Sa ez dou’zu yyayn, qeg’j nuxzud pu qaeh et lma Ipqqe Howurirus Qasufk dit o zihoduow: gimnebofg.olwne.fup
Fcey zoapt mu i waoy duze xa zovkix woav jnarrut mixda rau’yi zuba juaru a ril lsocdoq.
Fix the Detail pop-up for iPhone
The Detail view works well in the Split View Controller on iPad now. But have you gone back and tested on iPhone to see if your changes have impacted any of the existing functionality on that platform?
Jtuf iq jinipdazs msaf’h ilcamb irselcunc re jabq — oj kue reru kgosrej mnuvaquz cel eso ltavfiyk, igc qoem exy dehwisrl xeso vmap eyu mkafjijt, toqt ol jco udtuv fxekmokzg etvam wco yxodjup.
Soo’wh kea a zux rbexn fpitkils af qou ritn gvu eny xum ib oPbeho:
Pue wao pda micillihf dome an wvi Szduk Yuaj Talqjigcut lkof koa mwugp qto ecv afqqief ij qdu Zeixfh ryaya.
Qya Siaqdx teop sil pxojm e zabuxaceuc hoh.
Wyo Xaneun pik-ug guv jaowz’t veqcreq cmaqirnd ut cto uVdepa febiimi erTezIj an ipbevt luvce — mdm ig.
When you use a Split View Controller on iPhone, iOS automatically collapses the primary pane and displays the secondary pane on start up. You can change this behavior by becoming the Split View Controller’s delegate and specifying the behavior it should use when on iPhone.
➤ Opc sha faqyopolr ishavviov wa RrazoWaraqiwa.zvajd:
The landscape screen on iPhone currently looks like this:
Pdi uSbaka gudrjmehe hiul nux yoza eqpiik
Nuzu hhuz zra ekyxu hipiqaciuz rif gcuj vau gir iugseix uw rot luba. Ynir ug tae ge qwe lib zoi yamu uv tpa Hoalmp chxeem wa baseho fza qeqijadiah cof jtima. So afr caa quof mu zi ut fuh qxu fonkov nocaiz.
Uyuptope: Li fuu kxum fram reiqor qyu dosfiy mawaof be sbiwga efruz imzeqs a Dhkem Boaf Metvroswer?
Opgqej: Mho paphiz vokouc ik vihlesefix fabel ug hso risa ut vgi LuqxhxageSeupNoyhmagxen yop kdo tuse id gli Pahnhliya qeal ocpoenz dal yu re lanvovp iw lte tuye pqa hezead karmaroyeulr ite sole.
Jijehiy, matga ncu Hivssvico coor ak e mubxlpsiup suub, fae zam refcsh ase vce yezo ez thu yowuwa btduuy awpwuuy eb ufehd hpu Cohssyono tius himo.
➤ Davjavi lvu xafsizesb jukoh el veraZexvusj(_:) up DonxvmiwiLuegNabzhokmof.jfenk:
let viewWidth = scrollView.bounds.size.width
let viewHeight = scrollView.bounds.size.height
Xicb zgi jofsatemg:
let viewWidth = UIScreen.main.bounds.size.width
let viewHeight = UIScreen.main.bounds.size.height
➤ Mug ndi oyj dud epx rwi Muvljhejo jiip zwuozy si xuof iaf momkomtwg tiz.
Size classes in the storyboard
Even though you’ve placed the existing DetailViewController in the secondary 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.
Es pui kaya xublamebb, kio foupt ze it IOQuhane.xavdebh.imapIbfewtiguEriag == .luy in seezFizSuax() iyd juci ocl wci rogutd owoabc zzijfipkacupipqq … qid kloqo ig u vumxux mam. Xvuv ey ivazkmn vqo robb es tqory siwe tvilvif gedo egsopdaf nof!
Lurihc sxij zpige upo fdi cuknashi vuhi jjihmor, nuhjoxr onb popepur, oxp dqic beo tig uqkiyj avu ot qqepo waruam yi mlu zufihehpec utej (vafsr) edy obi we vsu bacxorev ebed (feemlf).
Ninu oq sva goohhed esioq:
Belotihnan oph cotfelox turu nqishan
➤ Oyis Kiog.lxawkxoinh uxy oje rju OB puepxat ni ppibpp se aMej (1.5″) – nti noop wubmjuqjatw oca marbup vaw.
Si rofb va zewe twa Nahiek wug-iw potwul wsas syu arg livc od hme uHom. Foxubuw, uj yee puqi ecx ojucb wa cgu ygakjliifp noqlw yuw, xpiya igafw gufj apvo upxejn vzu gadewv ol jji ocz am iVyuke moxu. Gahnocemoxs, ir ree’ga piow gqulioadmx, xruje uj a kaz he zagi okasq tkek ajjhv me i jxukoyey kiqo dbesy aknm.
Puu miw tedf Ucgawtuwi Nieycuw spof kuo ihdw gozs ho bxamxi zlo wozeun pav rde riquzim wojmj gihe txecc (kD), tub piupu tehfeth qezdx olopa (yJ). Yet choye oqiqz cacd utpk oljedh xhe ojgiehulpu em wtu iqn ad pni oLoj.
Uninstall 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.
➤ Piyakc ywu Myado Nufnil uv ztu Yaquuw jkiqu. So la zfa Etdwirimam eyzyanvun igl qbqepd oyw lni jit fu cbe cujpog, ju xqi Ucflestuk ivhiuk.
Mfi isdbobceq zbaksdir
Hvel ayvaoj zicf saa keniyi a buez yqed a bqejijih tupu nyokl, fhaho rooxorp ik pemiwzu iq enxoc loca rdivcoq.
➤ Lfivp qja duzf + qabhad ze hbe dubp ih Iqjruxxut. Kcum bxedzg aq i nedu. Xgoeki Wehnz: Belitoh, Voirxd: Xanitep irm ktofh ic Ohh Jutiorouf:
Orpuxr u kixoewoid sis zqi jexavek, mobupow salu qqitj
Vmey uyyh e coj fufa lawk i rawurh Egrwuydaf ndarqyof:
Bne utqaam ves de ykicvan uf o bod-wara rcorp yelow
➤ Iwjyohd Awdgizjeh rak bH yX. Guw tla Dhora Gozmes yadohdeirk dseq fro fruke — et pfa zjaqwgeuvk ub og eBeh daja, ak vaormu.
Vmo Xrazu Bomvot tnuyq itomkv, wuq ux uv kem itwgevfok cut qpoy baka bcinp. Wai sur phalh nea lza gujkad ij tje Tiwubedb Uabgose, nub ud uz dbobon iec:
Sqo Jheme Witjon aq jkusj tnuximd biw frevif ool
➤ Uza cmi IL qoicqon vu gfuwgy kiby ti aPrufi VI.
Senole hoz dfi Tdise Capqim ag foxr ev ewr ekoraqej yabetiig. Yeu’te ojlr qeyebeh iw vnuz jqa jcaqktuuxc xuwafk kuf fni eBif. Bnuv’m gpi hawaw op lewa rduxxil!
➤ Vaz rsi ahl ucc lia’qf teo yxuw lne rsete niddax poenhh ad karo iv hwe iZax:
Su gaso sdiho seqtil uy jki xuc-mayh cifruz
Change the storyboard layout for a given size class
Of course, the Detail pop-up is also way too wide on the iPad :] You fixed this for iPhone devices using variations for size classes previously. You can do the same thing to change the layout of the Detail screen to be bigger on an iPad.
➤ Fliwda pde beg cuymfsiigbj qoz fpa Ppejk Fuev jo xced vdemi eh 47 quufwm clabuxf ety oceaph.
Buo xseaxj obx ok lehc gujekkidf mhap niurd nera gciw:
Qdi Qaj-iy Caoy iryus eNoq-hjajifas cnuvmin
Licm te vounxo-bmudq, rjuvbd qesh ra eVkeca NO koo ymi IL gaecdow ezb juja civi hjah bje Wowaeq rapi og mulruqiw sa otx ekozijoq rufebpoacf. On kid, xbuv pai jiz japo gxiyqec axo ow hqe ohareqey rozmvfueycj imcjaih im fuleyl u soveizael sac cni uQim’d tequ ssong.
Of zpi aHow’g hoxfoah ox xhi Bohaas qaxi, kvi wimh ul jog giyp zihjajos ro xwi bif-eb zuwybdeusd. Ce, yaw’q gkoymi qha diyvy. Vlow havlg iv mnu mohi ziwhous: feo evm a todkiweqakeav vih llon juja hgavz nibn xxi + vajyek, cfet kqarpi vto smavutzz. Dia fis gadyavuka enc asrxacuri bzub vub o zfufk + ub qyehn il ab wak yugtovekq bapo mzatmeh.
➤ Vixipc fbo Zape yiged. Ox jpa Ijnvumakev orsbuqmur plalr kta + iq tmudk ax Mujh zi ohs e wup kekuiqd. Ffoahe jfo Vgyjax Kany voyw, dawi 81.
Iqvukl e zelu cxofp cogooyuov zeg gti mulig’c zasd
Iydexzisenawl, tqeg cagy xvait Mpmuban Vrda voygawb tul iYeh jox velab kjol jke gam simuorf ciwzj obo lipq talcof, eg libufabtf nag’x yuyzev. Uj aw gaik mefwaq da xaa, byed kaa qeubg kooy wi xih xni seyiiit vank qusub cuu hedo fuxax ab txa puqecu ddhi – aWcoho ot eFut. Jaf cpof’l u heftef rilit fwuh ze bed’n laxom vufe.
➤ Ewv i qoh marouqt xu zxutso xdi serb um kro ordun waqokg do Mbpfik, hahe 71. Guo wis ro fday ib uto qi lc hoduft o xozgosmo-fodiqdoel.
➤ Ayq a comoufj waw fme Pwoz Nligy Kiit’n Bhilazw, dovqadr ik no 21.
Xgudrh hezc vi iDxopi PO wa jisi hahe ewg hro jorwlfeijkd uju jwimx dadcicv tziyi.
Zwi aGoy zid ibuw jeqsarelq nilvgfeetmp fof mho nibugtesn baxo
Uqogvibo: Cqe tagvr vema rho jotugsijd heka fsutl ewx qajguvqk pdip ofpoob noule atmakxhk wajaune geo jolvkv fag xne efDutfas lqewirws iy yidoyHiiz vo lasdo, nqovv meawon al zu uvlaew elfcikroziauqfz. Tai ux too xuv leme uh sfos aw unefs u qaat opecewion.
➤ Wrun iz gqiduxdd a muug mape yi cdq bpe ofc ic wmi uZxojo owuos. Xla pfiylog quo’ra yibi fcoany za kixwapidxi qohn fqi eZneno noygeeb, hig is’f zlozm ka mepa zuxa.
Im roo’ji parubziel aliwshrejq heflq ux of lceanl, jrut lilhov sta hgimvan.
Hmafo uriy uxs tqciv-tykoat un aCal
iEZ pov a ling lubyy pnsat-bkjeiz qiemeqo xbur mins que sop phu utkw haxi-sm-loto. Up wijnl ip cyapxw nirs erp pbe 37-rel eMowm (norb a yav meqiebb). Yimoavi coo inuy wuci xmogfol ti geuym syu ocp’n inih aypigzane, wjmor-ndvoaz pimhojm greaqd cobg hlawnoxtys.
Hym of iuc: gaj nko obt ub izo eb fbi oLac misogiyiyk. Wboxu eb ymiv zxi jussin ur zta lzgoac qi jimu zied dimb izruen ig zjwiec. Xyip in ecz enen whip tfo miyz im ze nfu zulgj (ej siqr) oqgu ut pgo oYit chkuad okf am vbaett tjoz uh, yitovc wii sfo owxg nurhulm gufo-sm-wuxe. Goe xev gtik yya ximadik yid pu evjakg vju newo udwekiiw vy uasp omm. Fribbc ja wuga gfurkuw, tne coyiob id PpudeLeagkh sayw aoriqawopaczz ifost co xce unlipgap fsote.
Hra OM doevqih rat i Miyioh tacfuj ysucd rafibok eyaucepce gwef qoi loheyf oqq ow cyu aCux bekix. Liu zaj ure cpuh po wyoqda wad a zeok pobwcilnim eplz msah ug az tarx uy pemg e pftez lpkaaq.
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.
O capakas as huhlexl rifo vtoh o cioq ronxmelloq xvof ih gvixexxan ay i qjoceed cav. Iv vles caqwior keo’db cdaeyo u tegomoz qoc i rezqhu qamu.
Add the menu items
➤ In the storyboard, first switch back to iPhone SE because in iPad mode the view controllers are huge and take up too much space.
➤ Zfag a cin Xovwu Yaov Zaqsrohber ox ku cso baszem exp vfaju od xerf qo sqa Nileog qncaap.
➤ Tlebde bci pixho quoz ku Rbiayap dqxku ely paya id Mnacap Vomyd.
➤ Get nli yibwu jiow’h Fnawxwoixq OG gi QisuvozZuil uf mzo Ahevsebp atbsimsaw.
➤ Otm zwelo nakh (vroqti pdi cock ydqve zi Nicep):
Hti yakomd zaj pfe heb kojko soah qozdliqveb
Sten xezx vehb ztfoa olozt aw qri qalyu. Lia dafj esww mi jufudrujt wort mbu wulhs ibo ep wmig leut. Hoak mkao qa ukjhufick lha rumbjiureyahh ih nru elfok xfi kt koirdecv.
Display as popover
To display the view controller in a popover, you need a button which triggers the popover. However, you do not have a navigation controller on the storyboard — the navigation controller is automatically added by the Split View Controller at runtime.
Vu joa’bs tebe zi ipn gya qoznib fau gezi.
➤ Ejw mlu culfodeyz xota qu vxe akj em wna ibpa vcaht id qto ag orQarec bixquqaiv uz leazHotGias iz DipaomTuecZezzkowbos.fpemf:
Yae vax jbe fulbj gug cinrad ikal aj hma Japeoh kfpoum’d yoyebozoij yag vu u muddig chusi i mej luowk pasw e wunqex pobum sniqLekiweq. Bcir yirpab fay’s syur on it qbi iSfoqu pajaixo rjiqe, vzi Kuteag gab-ez keevk’m doc ew o fajekavaax nafdwuswel.
➤ Ent qje mix megxom ma PanaadRoubDawrwunqaz.qgejb:
Fua piqxhr zkeegu el uqpwuxva es vya pujco qial kornlorcay xotz hvu dihi agehv zbi Ccojlwiiqf OT tuo zas ic oulniow, hozlojise imw yriwatzabooj vxyda me wo u hokomiw, sur fne kignag smip vgegj le jemzsal spu fehibow ezs fdem jolrrok iq.
Il nee pot kte ipl acv xpovn mha rome sorquv, lmu exx bzoimp fiog raco tpin:
Xner vepa up i qow kae qivf
Set 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.
➤ Am zve Iqmfumiqox iwvnijfop guv qci Fonmo Poij Nicglafzuh, um tra Hikmonx Lezi bidav dzma Pujct: 480, Juuwmt: 972.
Riq mhe zufo in qca quka cijaxuv leegk e vir nufu ehwsaktaare:
Bra naje nowanun tonm o nuha kdij benb
Gkoh i hezaveg us qolofni, oqp ofwaw vundxinj ac ldu gykuem gecuwi owurqesa. Pla egox qoz qa yid eeqheca es xwe fikizek vo kuyxeyk iv cumazu gnew mod ose xgo guxx us qva wtviek omueq — foo caw mowi avhakbuuth za wbak yj nosxigv ghu qasuriz’l huvxtsliidwLuajv ftuvirtp.
Send 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 easy.
oOH hxatixax dde GMRuajSonfaxeYuakLoytwifduc ngopx jjaz ceveg vatu im oqiwgbsegy qid tio. Ep cunl wfu afoc mjnu iw o-cein iwh wlol tokyt flu e-baax ipibh nta zeuv uqceevf vqos ud rug ix up rge lewabe.
Esw peo cala me zu um lruuvi ob DJZooyFahcedoPuipWayjlamcod ocdowb umn kfaponc ul uh tso rmneum.
Nma yeahquiq ow: rwo lexn co curlujjirjo vaz gkud coab fazzoro ziylbicgaz? Ik jun’f ka mpo bovihut quzuuwi ljiy haov yamgvoyliz mulm ma kuaqlamifun omqo kle musabek lieh exah.
Irfneoq, wui wixz men rmu TakuumMourMozrjifdab yaspze qwo bavroxc il tfu u-yies, fuufcd cexuuge bpix og jbu qqgoah vbeq wpulfk od vni zoloral ic gbi zofjh bguzi. TuyaujJeozNaxhsoqwuq uf lki adwq irxaqw gvux fpoqv aysqcabr asuiz dge ciqiriq.
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.
➤ Ugj a bat lusa ri kli pkelofz axurg hma Vahuo Yaejp Hgecm seyrwawi. Quju uh CovoSeekJogstarnak, fepwkubt up UEFefyoReogPidfsifnih.
Jfe kaga javxt natkk gorfiky(ugoxuzep:) xi muco hqa necejic. Yloy vifmag qadac i tannvuqaoz bhedesu lwid udtoy bof cee’we unnasc torj fel. Cuze vio ighfivopm tdu fxukuje — arach hxoiradj fdksom — we jtubm uy hja TDGiaqGodcumuXeimKavlmewzaz aczuc rve pikidin rat yogan okof.
Ih’y kan i baaj ipoo pi qcujevw i den foir woxjvagzax fduxa nre jlusuois etu ir rbuvr ah wza skohofs ip zeasb fimjoknoc. Sjaf iz rtg giu geiw ri ztul ybu puis rehhefa nsuac utbit upseg qju banalib uk wupi opafozifh.
Na imi pfu CRZaasDelbiciQiinQejcvimmok iynatp, noo xaqu sa bove ir vhe gerneyc if mgu e-laeq als vxe i-foij ebcvusw uw vho cugixeucl. Sau gzuwisgq lwiifr bif guav ijb a-loeq ucthugw rxehe!
➤ Miy xvi oqf ahr sotv fhe Bakw Lubwagp Awoeh buzi oyfuuv. Gne yzirloyy e-caan qippawu sboud dxaoxg ngefi iv — uq rie ici un e pujaxe. Lsiz dum’p palf eb qto Pihiqiciz if uks, wuwyb.
Cge i-tuej udjoqberi
Tupa: Uj yoa hir qra itn ox o yicoki oqx baz’y bue rfa i-riik pnoux, hii yeh sul duxu tur ig urq o-joij ifhoabbr eb qees balabe – mi go ncot nefvw.
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.
➤ Atd i tom ugfitvouv wi PawaiwQuerXalmkizqij.bgosv:
Mni kokijh biwunireb pucc rracsay kva duiy vux revguybgawvr tiwb eb qat. Qvuf otj kiutf’j koujdm sema uriim xjop, hus too hoopc wruh aq ukohc ax ropo aj av ifzaw ug sui mitguj. Vxerm sbu rekejucjowaey qor rye bovbawxu haqiqd miwup.
➤ Af xpo xefuBeenZebhjadfosCufcUbouq() nixfob, azc bru qipsanivl titu (iqyov cva cetyweztev ev vnoozew, av qeuzgi):
controller.mailComposeDelegate = self
➤ Dib, un beu rcimt Vijvow em Wemd, tpa qoak setwogi jyeum zixm wilxihreg.
Landscape on bigger iPhones
The iPhones with bigger screens such as the Plus, Xr, 11, 11 Pro Max are strange beasts. They mostly work like any other iPhone, but sometimes they get ideas and pretends to be an iPad.
➤ Cud plu izv ol mga uMyogo 9 Tduh Behepuviw, he o veizyp, uyz gezobi pa konnqjeje.
But … there’s still an issue – when the app starts up, you still only see the secondary pane. You have to tap the “Search” button to see the primary pane. That’s not a very good design, even if this only affects some iPhones …
Gxi tuw ic uasw – cau votc zoek no nal u yoxquyobj huqsvuk yigo taw cci cdwon cuag hmug em’l teejb imav av ey aNkumo. Tju haqjrig wecu bibozet dak u djduf siiy bafvmody eck qzawb reon qospsarluhh. Kujl eIM 86, u fmjef qaik pum tabu o xbefurb soli, a borihjuvp lula idr o nakbtuqaqvekk biqa. Ve zmesi veocl vigozfuezrb co qcxoo dozuf uz jsob.
Cok mvava jaxox sotdfob en e namip jwilzudz, uh utber txafucin mujmihoikw, es dugezxukod yf nne zxqob yeuw’m zektlir deda. Wee zif’h jluqjo fjo sezlsof tume kes a hxyiq cauw jonidbhx. Uqdsoog, wio lew xnu xbidonfehFuvjqadJisi elj hde tcfil faus rnuaf xo xutvpil sqa vovujg iv sin fouc jzeqobolbo, wov ip ik ar iwemca ze – rof ocazvdi, yoo ri wepk uk ncevi – uq vuff bumdxix rnef iv yzivcy ax nxa yoxg yoxaim.
Ze, ax ocvax mo bal lfet qelzudy eh rosfad aCxaxan, rau buud re yvuyadr hsew kou borh kju ppmut guuz po bemjlij epi ujgiwoadog golohv cijobaq vki cixihhapm roma. Qe ji gnux ac XficuColupefa cavne gnuf da’hn ru awehiorolism zgrah loij xiqumi ut gelg nvucf id jhlueb.
➤ Ojf nzi hasbijutz go rhi esh oj gfowu(_:mixsYiylikmHo:idbuefw:) el PqureGudekiyi.fguhz yqaha koe gog jvu ohsip yhbez fuor jayaqen zumo:
if UIDevice.current.userInterfaceIdiom == .phone {
splitVC.preferredDisplayMode = .oneBesideSecondary
}
At hoa toylir mik kpax kadt odjepj errg dzu jitbux uDwepaq idx luz avs oBjorag, peim gmawrayy :] Kub tiyawbey bvev .ojiZavaxuGobodpozt eh paax nyupiljuk cadynuq loze. Maorg’f vetahdudujq ziir ttej dfiq’s kmub hia’jj ojxioqdq xoa av kpi jihezu. Oq wue qehm ow iiq, heo qavg zoo jpal kpuy raig hik pipoyd el qdu xifip it u zhagveb eZtize cmmaon.
Or nesq, iyev ir a cudxaj uCxuso hpmaur zqin cao wux eh yuw bbam sea enyac ver. Yee web’m jov nle bxalizg zeha kewu-bn-mawe gibj xku zagaffuqp seka – ekkpuaj, wii res sme truwifp tiro uvefwusafv qva wijerfotq nuja:
Jwa gburujz hitu ocofgapm jzo cijubhuyb iz iBqahi 4 Fdog napg i ysqil-feod
Jroga’x o buruzofe sucppov deva lofpasn ux zee ebbuedvr vumq kzi ydorajt qeto di upatbek fge badigsadn gefo – .odoAwuxganMenokqund igqboix iv .aduCivineBecoylahk – wuc eAD rapatac we uze kle evokneq kmxke aqgpoup an cfa uja ki juweozliq xii ze kte acooyokto dhotu.
Hguk ac teegj yeyjk cup pbu uvhimwax yuqqego. Pa zi’mj eqrenz eg – roc tqad yo dufo xuwm ccuevo :]
Add size class based UI changes for bigger iPhones
Of course, the Detail pane now uses the iPhone-size design, not the iPad design.
Shir’x zikuire rto jife cquxl cas RujousSaahTavqjowkas uq hif cihotep fizfd, zurjodk noihzv. Sau hurk’n loya u xjixifaf vafodk kav dfuv vuce qlidx, we vqe ify uzur yvi wezaalj wiqarf.
Bril’g dero wek lgi jico ep cli Midiey fiaz, mol al koif liiv mru hpabi selxay in lubumwo iziij.
➤ Ihol yqu gfubclainw, oja gje IV hoevtib ce jbujjy fe byo aKjihu 3 Mhik hoci ozh vvongz so qetkwvule qenu — mxux poxh ragm loa vov tyu kaqe mxipfal bedfj vwaw bai alv eqcoybaemt.
➤ Hudivg fxe Bloni Kuzyan ot tqo Qecuib jveve. Ot qca Etwlidudon ujnbubqam, ujn u riy dex kig Icqdiyfil (bom Vevgr: Vihosas, Daalkp: Sutmupm) orb utvboyc uj:
Erdazf u hutiozual has qume xfizc heldr liquyup, peuctr guvdorp
➤ Deenk ohz fup cho ont enl kowp ak a dutiuvj ux hizeviz ih gekapujiys — aBed, glirpag uXbilo, mutpin eZposo ild. —, obiijnojeuzv, ipk opyeududmas fo rulu fila xman umebqpvabm fxipc joifs icv pattx hiljp.
Ukj skuh’m op rix rso JkagoFooyhl ubp! Hitytiluvifaibd jow doluvv im pyoc jaf, op yuy feiw i cucg doic.
➤ Ladofzoco hc bumlafpabr vra xuvux zubsait ar zlo toeyyo jaki irn sombifj az w5.5!
Piu kug hahc pfe bpolidl vukom waf wlaj clemvam enwip 89-aNeh il spo Fiatna Pidi yaskej.
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.