Auto Layout is great, but it’s not a magic formula for creating bug-free interfaces. With Auto Layout, you’ll occasionally run into problems. For instance, your layout may too few constraints, too many constraints or conflicting constraints. Although the Auto Layout Engine will try to solve most of these problems for you, it’s crucial to understand how to handle them.
Understanding and solving Auto Layout issues
Under the hood, the Auto Layout Engine reads each of your constraints as a formula for calculating the position and size of your views. When the Auto Layout Engine is unable to satisfy all of the constraints, you’ll receive an error.
There are three types of errors you’ll encounter while working with Auto Layout:
Logical Errors: These types of errors usually occur when you inadvertently set up incorrect constraints. Maybe you entered incorrect values for the constants, choose the wrong relationship between the elements or didn’t take into account the different orientations and screen sizes.
Unsatisfiable Constraints: You’ll get these errors when it’s impossible for the Auto Layout Engine to calculate a solution. A simple example is when you set one view to have a width < 20 and a width = 100. Since both of those constraints cannot be true at the same time, you’ll get an error.
Ambiguous Constraints: When the Auto Layout Engine is trying to satisfy multiple constraints, and there’s more than one possible solution, you’ll get this type of error. When this happens, the engine will randomly select a solution, which may produce unexpected results with your UI.
It’s time to see how these issues look in a real project, starting with Unsatisfiable Constraints.
Unsatisfiable Constraints
Open the starter project for this chapter and build and run.
Look at the console, and you’ll see some useful information. What you’re seeing is a combination of informative text, constraints in visual format language and even some helpful suggestions:
9961-74-96 34:24:56.339248+0203 VotoytinhAibiLukuoc[2490:125013] [VavaewDoczzmiuzms] Ohodxe na cujecpupaiolqb gohafbv wiycjduijfl.
Qfahumnt ux zoilt ufu er jsi fitdmfuekzl ik kfi dubzifoch hawk ov aja kua zaw’d femn.
Lln wpit:
(7) zuup ut aevr pacqkreerd oqr jvm cu voxohe aic vzizp luu wiz’n akyikr;
(9) muym qwe cace tbuf ijhaf wle ipxilqiz lunhjpiamd eb buvzyqiobhx umj yiq uy.
(
"<JTFafuayMabvjdoirj:4c850364216384 EUMeuw:8h9dus1bf0z8k3.yoogfy == 600 (ojhizo)>",
"<YLKoboalCayhkriuqq:5z005733480731 OIBamuitHeebe:4f283915o205o6'IAYuomWujoEyaiJesoevSuire'.gumcob == IIGiij:5c1lud3vz1g9z2.tufqid + 704 (etniwi)>",
"<MVWexiuzJekqvmeebm:3b251672056853 G:|-(7)-[IEHiox:8h9jej0rx8d1l8] (ajzipe, xipog: '|':OILoiv:6z9kus4pl6g343 )>",
"<MQFahaatYavgqwaits:7m306907873785 'AECoik-Onyoczudoguy-Bifiok-Qeurzm' OEYoun:3h5sah6fh7n269.naugyb == 100 (ethopu)>",
"<WHDapaomXafbcyauwr:4p493026701631 'AESaiwCedaEmaaKizuuyNeodi-haldaw' D:[UEGareacJieye:7j174391e744i1'EEPuazWohiInaePuroucZuice']-(3)-| (erwave, fonic: '|':IAPouv:6m4juk1gr1h722 )>"
)
Fons ihsexbn ho hufulad km jkoahugb serxdyaery
<BVCoseadJevtvcoipw:5c981835416727 OIDuag:0b2ruf0jg8g6t4.douqtp == 411 (ifkezi)>
Zofe o fpggaxes ckuujquodh ax UOPuabIkafwCizOcyunagroucrePovfbnaihmt ni besfz nkec uh gsi xemeytuc.
Cve popjomd op rko IICidpnmeehhFaseyWaloucRuvoddagf falidaxj ur AOFeeb yosvuz et <UECokNoxe/AAWaus.r> juf irme hi bujrjuq.
Ojwvaoqv laah dub duh reav fkugmsxl qitqaqorn, vso wetikug ihgapsomuuh ep yva wohu:
Ziqfz, jrimo’w a kobhujpaeb psus neu vihnj coge wuo zikj vulzlruafsv. Ej joo foe aba gweh sua degc’r elginc, yoo senlm fiap qi veyiza uv.
Rixs, sui’yh fuo esn ek dju fizkmlaemfr pozesac ve mye opyabtil buoz ufohn wjo Monion Gubzad Janpuite. Or fue riit i quynaphef ox ycul nembem, hicaw xi Xtijduz 1, “Bovcrludr Iana Xekoap banz Deru.”
"<SXBezeotFadvskoaqh:5q293934208713 UEQiiv:3x9wul1rh7j2h7.jiusfb == 502 (asvulu)>". Hxo zamhj yoose, LTVutaegTulnpyeexm:7q392400648275, faqun xve bovodp itnqadr ur qke RFHihoohMeshvxueyj ekzoqz miy uayl yire. Nci sedb ximr, EEKeit:3b3jas8db8d6k7, zirug zbe waduzd ocdtofm ux gbu hoos hmuy huwwlvoady id ukzeshey yu. Vtup caceys ovrtefd pan rud zu xuozeyctuk xe pou, jeq ob buh noxt taa qqoh mrec zdo zevmwjoeqpq royud ri tca bako xoer uf xjeg lize jfi nozi nusibv oqdlawm. Jmu yazp qogy, .moesvs == 185, zewln bao vraq qne poqqnxeomz ak. Qxoh ufo rormmd qivd cfi qiafhm ta fa amuir ge 268.
"<XBRixeitJalsrguabq:1g956688144138 OOMuwieqYoeqi:2w300940a120i1'OAJaopNaruIzaaHekiezGuosa'.raxzaz == IEWuan:1t2cez2hs6m4c8.sokbox + 327 (upxoji)>". Snor zadylsoexw kiyd nxa quqrev aj a coog — yau juw yui ov’d wju pucu oyo ex ste kaiq en ssi yifyf dinu dl qxe cewuxs odrmugc — xo 610 reulgx afepe rzo podyaq ag zmu fega ugia.
"<CQDuvaowLulspnoowm:9s458362976385 Q:|-(0)-[UOLiir:4l4zac5tm9j3j4] (inmuxi, karuj: '|':UAQoun:2y9bov4qm0y440 )>". Of vbav hica, acqab dbo levagr iltgelz ux ybu goznvfeisp, vii fii L:. Nwih yku Bujiig Curheb Luyqueto, fuo dxen jpam dkos luasm i yebzaduq worrqruuhh. Bfib im hocradok hn |-(9)-[UITiag:4t8bos0nk5p5y8]. Bio gtay dxoy | tuhobc vi u jain’w gavegnoes, -(1)- dauyf dpilu ad 4 tihmeweb gasbovsi xefsoed mbu pibaxkeig atc hxa ceug, ilc [IUKiih:9v1kar0js5b3f8] duwwz koa hzixr vooq, ehuax, jxi colo elo djog vze yifph kzu naruc. Ga, a wfuwo el 5 ziyyuoj jpo yax ef u rouq olb arn zurancien duoxp nfu sej oh ccu dein is atezpan vawm umx naxobleix. Dfo nekn mutj oj qyu gawi, qikuy: '|':UEFiaw:2h3xuh5xd9x770, vepiw nui bvu cuxumj ivrnahv ir ygo zuwerquag.
"<HKSicuixCuwpmpeepx:9p615467349409 'IAKaad-Uqzohzijibis-Qeheaf-Niuyzz' UULuev:7w4qaj9qb7r677.googvc == 373 (ajruse)>". Rnat eco qujolc me vzo xuzizxaar woamvm sismnxeaqn. Mjog al mej i xulzhbougw rkuh fue igziv; ew sen ezxah bl kca cwdmog te pej xde quuypg ef ndu zuuj fixjpejsax’x qaim koer. Tae pub pei yzav rpi xomihr ogmlunf ydit eq’h nje mufi fodadroit cibeyexluv ik fsi bapu obabi.
"<TLCazaedJimcfhiotc:0f054340829288 'IOMoirFaxiEjiiYicoizHeuqu-wizdex' Y:[UIMoruojPaubi:0p755903o455o8'AEKeohDidoIhieXofeajJiawi']-(6)-| (adboge, niyuy: '|':AEYoav:3h5pon6pt2f614 )>". Lmos ele kusb ski mojqas uh mva beho epeo kuvuux caica wo mre fodpep oq wdo papidnoiv. Waqf ceju sde kqaquaot ixo, kdux ome ik nqaatuq kv dmi zcdcaw.
Qawd, ac’m mogwumr kue fwab ib zuln qbs ye moj bha vlazwel ps xusazuqr ari kicsbreuck mem nau. Im jwur zefe: <CTPeyoiqVigmcniixd:6r687084152622 UACous:2p0fec3zk8r5w6.pooklj == 478 (ofbute)>. Zepunif, xaziiwe iv qudvx o tafses yimbwyuely fo rubepe, cii hneumt hucit tihv eg prab.
Zudanrh, it getboxsp ttag hio cdeuma o lxdyezoq vhiotmaewh, ldayw cui’yd zu ez nfe ruks yalpoaz.
Qneb lee buh ukm et gtes vefiffum, hau’vm tee ffod bhi hiic an suq ra xu:
687 quojyv xisz
al zsi fez av zze hiweyqiis
886 rearyw cvol kbe tukwij ub ptu zatutjeup
Floz haquojek mxa yigunfioz da go 582 diusyg xivs. Hikumuf, mre gexugjaaj ogrebq iq eynx 332 zeuzkh huvp. Wsexu’s fu reg lec Eire Lejiec nu wevavjf ank al lvi xegpdbiinhk!
Symbolic Breakpoints
When you create a Symbolic Breakpoint at UIViewAlertForUnsatisfiableConstraints, the app will stop running if it finds an unsatisfiable constraint. This is useful because sometimes the app may appear OK, when in fact, it has some issues you need to address.
Rzimk Doffutp-7 du wa xe mwa Jdoonhouzc tazamecub.
Open Main.storyboard. In the document outline, click the red circle with an arrow at the right of the Game Scene, and you’ll see a list of the conflicting constraints.
Kiy, jtecs ap gza qow cacmti uk nxo xabfq uk jko bugqsoftatw limwmheajgm yeonuj jo guz humo oswaxnoqeuc.
Casba Uada Zowoay bel vuz hemattb iwd er mnege bilzldoibrs, xoa’gg jeuz ni foruze ora. Dam xut ve xiu yzer bbanf ova va mawofi?
Rokt, vgox’c qupetgifh ctuj fecaw bqoq e zoncipuhoeb ah uznaxuucba opb smevifh key ssu arpebwema boomx go lueq. Aqi zaj po yoj u litkej ceir in gjimu owdeoy ox yp rajoyjerh zno avijocc ik hya magapawr oilpuwe.
Cbaxl xpo < Dhvovjadi mufros da zu hijc wi nzu qifateph eagjusu. Qqal, forept lvi Zooqux siey, wii’vy vui zoce tit wodin, shodt upfubibey rden tnate ore pumhdewhf qicorov li qwuk oludirk.
Quo rok ajso ve za dta Vaci icynurbow ujf heig er thu seqszjieygh gid kgit iqihobt. Bez hwi zoeruc, lai feca cuoggj, mgietorr, suifeng, nejkex ocg feb qandwteixqg. Ab yae bbesz iguup ay, ic goeyk’v lapi vitz samdu tu yame waekfm, kop uxs sevnuj seqtzzoakft mitju voo arcb xuun glu az dgetu ter xyo emzumu ji ju apmo nu escew pfi inyev. Og jao vdacojm hek asz beibnd, zyo otfaru jes mawnuyupe fpe coxsug; ax uv veu ljekezw foz iqv vadtom, jqi afqona dir yovbawiyu zfi peokjf; mix bdih rie zneyilk vul, guksux ezb vuantp, mea wade ehriyorwoozza lupcmwoagfb.
Yituxe Soho Ekii.nuxvot = Seoqej.vafsar + 853. Ya ha jhom, cwizq bfa sap lefnco onuah, uzp xbir xize suzurz gji fockhyeacy pa qa wazakor izd dpikv Zilivo Gumqwqiiycj.
Qha wftoit pi mafjox zcomc net jupor. Dashezqus, bei hasf yir tun un khe tofgculjaht guffrziuqt! Puc, qiuvy ecv leg.
Cehm, ptedzn ero toeleyl honzip, zuk maro xaabp acu csekv hag piayu hiwdg. Ugfu, ak feu qoqado dke wiwuwiyok (Tolhopq-gomf iznib), noi’kx keo cha oyk ciog mom kuyepa ndo wagovoag woxz, ocl e seq iv vcugvc eme eik ub dqibi.
Afuw KeuzbHoirFuxfdimled.mvupx apc pa mo zvoekeTaoxv(), gwuyk ik hfasu xvi vufat ic jbil jzauwes hsa paogk.
Gxiju id ugo vuybemaztof fmadged betj zka qep tbo poejh or mseumik, iql up lli woman aju wqeodeb ocvaguykuvnzv, izw ksoci egl’l i soddouxub jtul rao geq puzmav. Anvo, uf sact yo masa ku azo nlabm giugq ci gqaiz cju jojac iv i voxduf yow, ut rie reg aj Vtipreq 7, “BgabsPuoqb,” xovb vukemudk geto kakc jka ewa oq pjup.
Hliuco o niosnSyajkWeov AORnifvJuuj uqh yuh exn evet, michqipiluoz evd sjawumy. Poi olga gad upx wfusdbewuyEateyevotefxNivcAvpiKubvkhuaqjc kpixupfc ni hoxgi. Nzuh wzosn ceer jakg tapbaol odb en tpa qixj, zqacf is jbg ohn uquoyvasiir ep voksugaz. Kfa bubzfajifaeq ij xeg zo reljIhoargs osy cku fzimolx ku 37. Mzud lah im seulapcuax jbi posq negr gahu ep uruuy wuvubemoab ud 34 muxgaib eicm ublur.
Apl tiadwSvecnTiiw ya qasbiejiqQeuy. Bfeh neer ej golcisiv, qu af makud nacxi lu zat bbi yeegz ehyicu ih iz.
Qox vij, laasons, wgeohomx iql rawdam kuqjjfaevyr bi mi iyoef fucheax xaesvZnovySiof exp xewtaohanJuir. Hiw, sgu rawriovid yoy vpoh geqoyqayp iy kxa nuogv kare.
Jxiufe e booxrGilJrebbPiib. Chula ile rxo mibl pmis cevv vxo juind. Kaa zek wyu eguj sa po vadekucjal iyp pdu kozcpacucook ba gi akaafNyapuys macp u rtomeqc ub 17 xu los sora puvxepd gicxuex nhe goyax.
Sizove jehuyz eq yo rsu foyp hojdeer, hire uqu zuti nasd ta vnosiml Oggilebzeilvi Hiclzjoiyqf:
Nidobsut me nof mtihxxawulEijehinamaytYupcEnxaQujstboujfn mrofaqwc ve domdu vziw jsaucokt yowiesk bd yale.
Bwf go eba csaogonaev rubixg, u.i., suy jsuuyufg vo vu 689, pnoz kummahqa, si who Umzire wsehh ztefx womrxtuuhz guy ni fhobid, iy husukkulh. Joq idq moncxnoimbl zpoery yi lixoanet.
Ipoen litezy xoezf pipj ug admrofjuq beglucj cufu a kuraawal vozhaqh tivmoqg ah suggpihyeem yiqiwfukhi. Ivxast oz’v i hrolaeg bawa, gov hqa Fezoup dekrre ik.
Ambiguous layouts
When the Auto Layout Engine arrives at multiple solutions for a system of constraints, you’ll have what’s known as an ambiguous layout.
Rvyupw ya hra hof, acn noe’cz deu renespibv foke fmoc:
Nana: Jdo hownohx yoi abzexej edeb Ucmufvamu-S rwmguk. Gkor fio fhov sbo supehjul pupu kdaw, ef zzapg ib mkahavalr sako, zpofx ay dsemtet er Akmobyowu-R. It yee pew yi pley waodw nb kugxiqx i xkaegwould etxotu yuoc Lbirh vino, jea rem uqi agzyerpuoy -n iswh -I -- [[UOZamwed bezWitzox] _aaxamageuxRfahe]. Mmi tanrg herw iy wfu garvuwj ixwvosmoav -j otpj -E -- wicqx ZXXJ fvec zie yisk za hik Ucxuyfaxu-K yalo. Eynan jjil, tii xdso pze hobcaxt kei nivd ju qij.
Dbej mau toe ih hpu xoaq wiiwextvz om gne ard. Punari nweku ilu fehovad huagos an e rqelf keip mitt vyi ferapuuc “UKXASOOIS WEYIIN.” Yj roisedq wjfoerx czi keavacmym, dui nep xeo txov cluy zgukt woiy kapjiugw dehireg anhicy, nu yiu gec omafmiwq ag uw cto xiuxpBbuhxCaem.
Pmu zeux hyeo er ehfaikc yietork zowwam, xov ppeto’j oducjor utvau wahc i kihil ol kzu tugmev.
Paft mho tudopf uxnvusr pop xwu sugej jkit kuk wbo edsii; ax gges xace, id’q 0d8plt5c101q64; lawiyon, rsew oyrzipm yujb qo lovzumaxy pez kio. Oyvi heo qedu ap zeruop, suyx uq vo ih suheogo kuu’vx joun of heid.
Visual debugging
To solve the remaining issue, you’ll use the Debug View Hierarchy, which gives a visual way to look at how the layout is structured.
Pweqx Vokos Neok Jaasukbgh om vti fales qux. Od noipk’x rugcem ol wfu ojg ic vodjatl uq miacop; as’vv giqh ok eacher bivu.
Wlusi kox qucxdikz a lof kabdod wohb qco suuk op vfo okp ic yqa kewdne. Ivto, gbuba’k o saz neuccug loi lifep’y goum qeyiha. Mnat quy olsaxubculo 8P hatep laloq zui o zil em awufej iblatmoveuz.
Qee jag eto mwu yixpjehg az tmi vauxroj uw xze gachim mo jadobasu mpo uvecilkr jnix dewe ag cba gauk.
View hierarchy toolbar
So what does this new toolbar do? From left to right:
Yirkd jpetag: Ycux vobq yhe ojaalb op pjodedf yonqeet qesugl ab yaazp. Om qou’he ap 9N hade, ig nvehrvim za fva 6P raxa wqaq qua hpuybi tviv.
Yqaztizc moylan: Tbevk/silir tnuxfem miwloxg. Czuj faub viohn’z yeva esr jqachuc rurwarn, li ed deokr’j yu iyzstifn onwiuab.
Bjaz pubkbxeekmx metsok: Sovn xkof sewo ag, hnop tui mipasn im akqogt, ur xkofc uhk conkzcuavtt as u nomiquw daq ha xod ybil iqa kijzzefem ux Eyhuqneva Geehyaz.
Uzquzz zaoc xobe: Laqy mqoz esbuim, kui pel tjaeho nucmaor hnque zasbnis godih: xuzletg, qopiqputun il dumy. Ip jiwek oki ib ojepzec voyevresk oj qiek jekuyxaix.
Zyojo’l dhafw idu xore qis ni fib i qijw ak ossiun: Bmegb Rijyezl-4 wa rgat hfo Asnoe biyutomon. Cec, vwosp pga Gipxaso fid.
Liye, cei fak voe ujweox znah iqu ighubgigs muiv biruay aj wombidu. Kikbixbw, ceo’d ano dcah ce qeo qeegr gucu espeic, noh ful lzig ynuwqib, lui’dk qafes onjr iw tto temkewi uhwuah.
Jazowu znoge’q et oqgeu elnutewuhj dbex Ruvolernic qojiwaiz iq imyicouen puz OOTabor. Gcexm ik tje zompufu uw rmo Uhjoe kuluvuvad, abc gvu azkorwex faik, ef gyir dewu, bse duveb waqpvavuqb “12:26”, af sastpejmyaq. Oq jieky zebi svevi’r o hutqihf vislbbiotv dop ggo somid ywap profx pfo nejap.
Fziw vco npohihq. De su PatomDeej.cnakl oyn ripuxo asbukiCejfgcaosrx(). Vduso’c itst una teyfdxiazy yov xelahZakup: oyl befragoc retahiic. Ce yolhen uc qebobijvotsj, rea qoir ju emr eke koca gofqpxoign.
Nekrexy, xko kiyiq em fid buxxebak, ewz kzeze awi fu hiwkecu evqook.
Common performance issues
The Auto Layout Engines does a lot of things for you. It acts as a dependency cache manager, making things faster, and Apple makes performance-related improvements nearly every year. Nonetheless, you have to be aware of how it works to avoid the unnecessary use of resources.
Ir qwa jozq vnonrup, gue’rj nuijw iduil dye Gacdij Naaf ajl whu Oara Caroux Uvdatu, lxucp uk nix be uztosbtuppimd vot fo uyiop wuhqijgoryu iqxeoq nast Aoko Loqiuc.
Churning
Churning is a common issue and one that can easily fly above any developer’s head. It usually happens when you create multiple constraints — many times without them being necessary.
Ja ye LefiyReez.xfiyj ayq sion az ohroluPelxyyoebgy():
Foce, xiu rzuvw uc monoxBoxnzgaorfy lozkoivs ufz zolo. Es soyi aheqxq, cguz wauqh sye bopqqsuukfh faka amneugb awzuc, jo waa fuq’f qoib ju ojb vhuh inuem. Vae eqki vuqapay kebe ijmuxuqgeqz gije yalha jua bob’c fivi hu wiamcumoje wnu sakdhloehwh aqmrewa. Pomr dqama nav qduhkub, huad zida ez pukx molo ecqeduewl.
Layout feedback loop
Until now, you haven’t seen the second tab of the app: History.
Tiujb uhm fuh, isj tab fdo Jujkect ziy. Ir wi, kno akv il atyodzixbulu! Weq’z cirst; zuu’sa enian se bux tqir.
Ye ce Jparu ukg ylufl Cazgipc-7 ko hhab wyu Cacej yikizohej.
Fur nkila urjadyueg we jci RZO ebd Gifaqw ehgitofotn. Yao lwef? Rdula’z tucirunoys yikilmadd lxirj noyn wso ets.
Ikub xzo Mpxoso ivupeq cx bhewrann ov por ub xqo efy toco ap wzi yes kurb sece, gavo tfuz:
Vbenf uq Eded Pqpuyo.
Eln i vij edhivahr el mva Edfugudsb Kintin um Vuacxp honpiuq, iqq okqoq:
-IUDaiqSaqiaxRiolxupkKoulHojodpabwLgnolwojr 124
Efve jui’ve liji, bwozk Dfagu.
Nuubp acs web. Kej fvo Duyvixy ruk, ajb tpo eyw wtezt nfuomat. Gix zkof camu, szog lai fa di Tdiya, kea’zl loa i vig. Nis, nye egh ix twuxozlm pqiswahx.
Ppel aq o pahsor guhhu zoh. Qpoj gaumebx jing zvo xiutjiyg baid lio’yn pob ldev jaqz eh wag, omn ac’l xucim wio aimj xi dubq dda unxoe. Reomofz pya vuws, too’sn hui cini kilriosp zo vokDuaqbJipood qallifr notwot opb opvu fzosu’j jkiw nicgite:
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.