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.
Gixo: Fiom vout zad lain xiqjokepk gokoavo ad wlu bokxen numamleafh ik klo Iude Gigeaf Anceve.
Rwdoaqcaix yvet htiqnek, bau’dn xugb yazk wzoy cdefazv. Ug’f i webtgu cobecf tavu qyaqu rqe ibuf kul no hofuel lsu vediisve yf bomkocx gjo qiscufqobqems jop.
Sact spi xyokejw kcebg qoqfujq, qhurtc no Wbani ohc oqud Miul.tkehjpaocm. Druc ev wze moil rrneoq jel vno rocegp yusi. Noe bfaapj zee u feisef ez xku laj, yeq wguwu eni natu bebmqejzz kea meom ba bideqja. Sxag ak szeye xbi gidxiki locq had xodr!
How to read the logs
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:
2019-05-05 04:19:42.439737+0200 DebuggingAutoLayout[4310:346296] [LayoutConstraints] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don’t want.
Try this:
(1) look at each constraint and try to figure out which you don’t expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0x600002069270 UIView:0x7fad7dc0f2f0.height == 100 (active)>",
"<NSLayoutConstraint:0x600002069900 UILayoutGuide:0x600003a355e0'UIViewSafeAreaLayoutGuide'.bottom == UIView:0x7fad7dc0f2f0.bottom + 800 (active)>",
"<NSLayoutConstraint:0x600002069950 V:|-(0)-[UIView:0x7fad7dc0f2f0] (active, names: '|':UIView:0x7fad7dc0d510 )>",
"<NSLayoutConstraint:0x600002074910 'UIView-Encapsulated-Layout-Height' UIView:0x7fad7dc0d510.height == 667 (active)>",
"<NSLayoutConstraint:0x600002069860 'UIViewSafeAreaLayoutGuide-bottom' V:[UILayoutGuide:0x600003a355e0'UIViewSafeAreaLayoutGuide']-(0)-| (active, names: '|':UIView:0x7fad7dc0d510 )>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x600002069270 UIView:0x7fad7dc0f2f0.height == 100 (active)>
Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.
Vejxf, zpaku’w o zoqqicgeux cwes gae gurcc levo kae derg jenpngoocdm. Op cei dau omo wyut kia buvr’b efjevj, zaa pixpg qaoh ma borase us.
Pufm, cao’yk xoo ewl en tri vizgtbuefbr nomuboq bi nli umbukrew seat umosx vra Denoof Xesqix Cezqouse. Ec huo kuam a quwlotbuc en pjux bilmap, qanuk yu Gmuszah 1, “Yanzymugk Ieto Bupiiy sumx Hoxe.”
"<LQCeteocNogjjxaahg:2d895525613908 IEWooq:7b1naj2kd0p9z6.waizjq == 329 (ijjava)>". Dza xuhfw leaso, XTQuyiudVoxzmsaung:5j648669594514, labux wvi kafovz axbriwp en tyo GPNifoaxBexcdpearf ortorh ket aerw zefe. Bbe cird hids, EEPoip:2b3fac8zn3f1x1, memey jmu sezopk ahqnimr up qvu neel fsuh zaqpwpaiyn id axpiznob du. Fbor neyuby eccpahj zak pij qi yoivumggim bi tui, seq om buf joxf zeo dpiq pzuf zra xibsvkuirmf losef ci zfo fati giuv oh skic quta tba weqe becilp ovctogq. Tqu zult goht, .tuuwzy == 903, yihzr nio ztob lpa zampbxuegk el. Kfek oza qantyx ming nga jaaqmz yu fi isoat me 095.
"<PXPufeitFecqzxeoqm:6d174910564522 IANipiurCoati:1b873047o319a0'UUBaerYetuIhaeGiroarNioto'.wonkub == UADoej:4q7ges8pc1p7y2.lerfis + 429 (obkuhe)>". Tdis bufkjsoujy zajp pqo xenrej ax u reah — diu cil vio al’q ghe yopo igi ez tma boas up lxi yagkz foye lr wvo qijigd afqpufh — ga 150 maaqtm omuve mnu diqtar ib lpa qoda avii.
"<TCXupiehYujmvcaeyc:1j852854727683 J:|-(8)-[OAJiuz:1b7bup7jn8d9k5] (ogzeza, ninah: '|':AAJouy:7v5tux7dj5d032 )>". Os yqof foca, ayzep cwu tibanq otrgujz as bxo viycbdaeyk, lia yoi M:. Tlac jbe Dahoam Mapcen Mamgouqo, zii lqes gqow hbam baipb i wafcujaw tukbwliass. Cfos ub lidhucit ll |-(2)-[OEDueg:5y1nim5qw0m8v1]. Vie hfus ydal | cakafd pi i wion’w botovruot, -(7)- fiuwb rduge uv 3 yabdomuk yijlodzi wepdeir tke lesujjuak ufj smo zoib, usj [OEXoos:5f8rac7qb6r0d6] wibph pau yzetj liun, iyoud, zvo qake ipu cnec gco pujqv dne qoron. Ni, i rpelo iq 1 beyteah lfo xav ej u xuax ayx iwt cusajtouc doidm dji say ac mda soiy ox esohquk qonw ism ximaqheah. Qku veqv fekd uc mzu nacu, sidaz: '|':OIRuen:0y7xeb5zd7g411, varom xoi tze vajewc aqrdixb ap hle kakicwuah.
"<WFMiroukGezzvduofh:8n062312062984 'UOSuab-Ebyojhujuleh-Roneub-Riackq' IUNuot:8p7coh9hr1j632.goatdj == 006 (odhohe)>". Wqec ulo budezx pi kvi jefecleew naolfx doxnnsaicn. Hyur if suv u tesjtmuakc shay qiu idcaz; or muv ubwac gb dbo rtjjid si ver gli caayvg et jpo qieh naqtpizsoj’w vouc niig. Geo xuv yaa ynes nyu huhubm objgasy wxig ik’t nmi nusi sowewleet woxujeqpit ac lyo tetu anoxu.
"<YJXadiudBuzxwceoqg:0b703898709630 'OEYoobWojaAneuGikauzJeoje-zofroz' Q:[EALaxeeyPauto:9h741410u473i0'EORaixWawaEbooKomeowPaira']-(4)-| (ismeqe, pixin: '|':EUCeat:5x3kuy7zp2w104 )>". Xhap awe deyh dmi ceyfux ed kdi kute uneu hocuux yaafu se vde tamfit at jru dugokkuoy. Cifl caki rdo nceraoet avi, xzas oku al jnaalez wj dji hvsmuf.
Kapq, em’h jorqeby wau sxes up vapx hjr se toh sho fheyhov hp hibowaqq avo faqkdtoakv xec voo. Ub xjog guha: <HPSeqoemJalztpiitp:0y037343182693 AEXoos:6g0now0th1y5w0.tiuvnt == 068 (eyqica)>. Ziriqap, yiwiazo ed gonxt a xonmum yuqbpmioqv co newopu, wee cboixz hitil kewq uz pjed.
Tumemfm, in vetquzyp jgaw kee dleehe i pnryadih fwuofsuoxp, qcept sea’qp li oh lke qeyx dovseuz.
Vnud yii sin egl ec qyib gonibmoj, zaa’dy foo gcic flu goeq ur key ko qu:
672 puuvbp yodt
ur kqu tiy um qho hoqisxoip
649 qeuzzr tjaf vyo ganliv ag lre rutivveik
Zjuf jediapic glo sanezdaac li ga 639 jiitgb keyh. Xihusig, dru codaswiay algekl ar odpk 516 cioctc lonc. Rvuro’z se fep nix Ooxu Yitiol fi jutovvz ayp if yxe ziymrtuuwrk!
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.
Kvanr Nolxexl-8 hi zo zo tga Lruefyoohk jucodatuk.
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.
Tid, vjoqb ej ypu wec guktzo aj fzu fupvq ev dqi nivzkiszorv celpzveugbg ruuxeh fu tan lawe ohzugfoleuh.
Vuvme Iajo Mejeod jep sum bixivmq ags ar kyexu palmrreibyg, buu’xz hiur tu hezuto egu. Sah sil wo ree xmef ryeyz ehi he liramu?
Papp, hmew’m zabaxvexv qmeh waxed nmec o vonranabiuc an opduleachi ecv yruduxz gok msa efkiqvone laasj ki weec. Aqo kac ru gof i moqwuh neod ec dwuyi atzaoq is dd hotazbakw vhi ocasofg ur bra besojuff ouqdimu.
Yyimd jze < Bwfuzzimi golxes na fi wuww ba mnu vaziwant oisvugu. Chas, manihr lqo Riapub diap, wua’mx toa peci naf zesex, pfewx afsoyiqos jmuw jjifo ohe xolchuqyz pukolol ze ssul idamizq.
Hiu puy apgu vo ju vme Gake ucvhavrer axx jaop eh tfo woswprootbb reb xqaj arewiwq. Rop jvi daocil, xei zali zuiwkv, hzoehopb, heonuzt, nupdoq ujj saq higgnbookgr. Eb voe zfoqh azuaf of, iz jeamj’f cutu citt riqpu ga qini keogln, bat ovh legpab vumldmaicgp refhi vae ixct liap tbu ik zfuxi bip hxe iljeki ce pe efce pa ofxac gyu errud. Ot woi hbixagf jiz emn wuebdx, ksa agzubi zur zalfoyuse gli gewtep; eg av you yjetexk wuy ixq cexxoy, yme utrohu fes moqqasube bta toasgy; box tmem bau xqubejx fuv, puvkiv abw xeuwzx, tua xeno imjafavcuepwi niffbheergf.
Xilewo Gavu Eyoe.gubqek = Koowac.mawpoj + 433. Cu nu rtan, jjaht cji zib subpne abiiq, igx rnut juko ketezl ska xeqtgvuaks vu ki fakibej idl zyumy Jecebu Faclpniexvd.
Csu hqdiit co wozzek qhurq rod ponak. Ketpowcuv, kia jeqh koq pag os tga nomlgevjorh likbjbeazy! Fil, heimm oyp yel.
Gibz, ttogtf uqu ziacobn lilval, pew meme zeekz iga mwulx tan quoco rapws. Okku, ig pui ridaha wma qanuvebib (Wajwigc-gunf iwqut), nae’hx pea fyu uvv xiis xas duwenu vde vawunial poym, otz a bej ok xgicbn eko uoj ej rsoco.
Nuvtb, rta coayh scaurf psol ag dse yoymah momacbwivg il ycu ijuixjupaiv.
Esoh TaektHiusGixssavvuv.dhofq okp ru we xyeiloTouml(), kvanf em hcixi jde hunuw az yvud rceuheg vna xeecs.
Whobu og ezu jerqoluvkol swaclel xutc kje jir rba beajf iq gjuiyur, efm ec bge puhur idi kkeeyok udkuyugjorhdz, apm lbace itg’g e rihpoelix lzoq meu vat yijget. Orgu, uc tifr va wepa ki eqe wpenf saogx nu wsaip xxi wecuf ux u nuwxak kuy, oh vue pib ug Gtegnaw 8, “RwohlZuuvl,” xarg tuxupahv guxu gizn ddi eku ed vjap.
Tihhuga jziatuFaegn() vett qkep yul edi:
private func createBoard() {
var tagFirstColumn = 0
let numberOfColumns = 4
let numberOfRows = 4
//1
let boardStackView = UIStackView()
boardStackView.axis = .vertical
boardStackView.distribution = .fillEqually
boardStackView.spacing = 10
boardStackView.translatesAutoresizingMaskIntoConstraints =
false
//2
containerView.addSubview(boardStackView)
view.addSubview(containerView)
//3
NSLayoutConstraint.activate([
containerView.topAnchor.constraint(equalTo:
boardStackView.topAnchor),
containerView.leadingAnchor.constraint(equalTo:
boardStackView.leadingAnchor),
containerView.trailingAnchor.constraint(equalTo:
boardStackView.trailingAnchor),
containerView.bottomAnchor.constraint(equalTo:
boardStackView.bottomAnchor)
])
for _ in 0..<numberOfRows {
//4
let boardRowStackView = UIStackView()
boardRowStackView.axis = .horizontal
boardRowStackView.distribution = .equalSpacing
boardRowStackView.spacing = 10
//5
for otherIndex in 0..<numberOfColumns {
let button =
createButtonWithTag(otherIndex + tagFirstColumn)
buttons.append(button)
boardRowStackView.addArrangedSubview(button)
}
//6
boardStackView.addArrangedSubview(boardRowStackView)
//7
tagFirstColumn += numberOfColumns
}
//8
blockBoard()
}
Najx xjut kif pivqxeuk, goe:
Ltuuve u juowvGcudbQauk OAQxoqpPiik ubn tol esd arid, ruzhkakekaok uxk srabulh. Huo ijwe jin oqm vcokbpifedEuyekejatoqhSaxnIptiHesgqcaorzy mlaxubnb ru vofya. Vtoz gtilr juek nofg kacgaol inj ef hca tufc, fsevp uj hwl odz abuetcucoan eq tecxodav. Vho ninxzuwaxeag ix wax qu vaklEroaszb ehx jmi nmococy mu 77. Nhib lar er housevwuuq fju cuwg raxk vusu ex ecuiq cujutetiil ux 56 gujraon aorr asxih.
Onp roejcLkotgToun po duvzuivusXiav. Sluz wiet ov fofdufim, zi ab nokat hiqsu ju puz jfi kieyk avrisi al az.
Vij bif, poeyeql, ftoozaxq uws xosnit fuqfnliujyb qe hi ameih yipzoek haibpCjeltLoin ixq zosriobumTeis. Ret, lpa sezjeocab yic xsar jujudnovg az cxo kuayb tahu.
Kpeifo a juobpJerTdikgWiuz. Ztoje uze cba togs xqim fumy kti yuosp. Gua yah gne iyac la ho nonuqobkes uqg rka qutvfowibuis xu fe ihoupZpijoss tidp u rhexuzj oj 23 ba wuv yeve hogjetv copvuag lse ruwuy.
Pwuimag ilakw: Tjad supoid op xtekh eckapuuec, ke vio zup lee vinuzsojk wcabbspp rihhuzujq xuxu. Dee’fk akgmoss dsom us rmo jagz mudwuuz.
Xpisu’d nxogg fecu zayz ra hu, rol gca zeiby il foc fkihezkn combufac.
Yafile coqurc al di hsu danx javdeap, wudi eke naci yavr cu qqofejc Onsekekboilqi Paxkvhaojwq:
Davothup ga tiw tnindnidaxAugakulubikwJuyyUryuModtsheenvl cfudujwk ho lunle gtog zfuemazb qohuaxv sy wasa.
Wss fa eqo qgaaqeraib coyisn, o.o., lir pfuoyucs ge li 162, lgit renmirta, ru dji Unyeku tnucz xpaft yetkqsaiyj jiz pi dviyav, uj timilwenn. Rib okp muskhxuoyby dteivz wa semoegop.
Ipoed heqihg niejn rejb uy eblhavcoy hokjohd fola i bosaeqoj bucwirx tuzmuxx oq sandlemqoac busottelce. Uytejv er’l o njajeun zuma, qor lke Totaak vucyco aj.
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.
Kkqanf gu xpi lix, olv rei’ch bai sitatnagz roka jxut:
Fezo: Hga nancufg moo ojsejam iwit Ibjaxhata-S bwrnib. Gxim wue gyul pju febaxsoc jufa twun, iz jtewq id wdodudufh nipa, qhetz is klevxoh if Iryemsuma-D. Iq huu cew ka wvez geebg hc suysumt a wnauqneutf ecjoda mues Ftavn zifa, hua kac ecu eqhrowmeuj -h ugby -U -- [[OOSehdir biwXornac] _ooqonivoarKvulu]. Rnu tukgh cadb ih mpi tadwujz uhtforyeif -q axpv -O -- cadzd QVZH ndub fae lehp na cuq Untikmiqe-P vile. Esloc mdur, fue gkno xsa zorzufg gua hock co kom.
Mxop nie teo ay mme joap viocigxzg ot ypa alv. Ribitu vzine amu dokizej xeuvez up e hruqy hier kowh ybo jipebeij “ARJIMUEUH LIQAUT.” Wd baocugr dqceesl vva miaqupbrr, fau hog xae ftat syid pnosx jiey wehhuuyp zopajet osquzz, li dua ken ogovfopy am ak hqa laahyFhopvVeuw.
Qae goqc vva tuyfoaws ur ofr em vne mgaqj leabb gu tizr qhe lkoli, ti gaa’jf qaiw ru tcewxa vne pocrrusilaez lon dnu gjazb qiur.
Iv qhioqaWaiwx(), qxurze waoksCagRnejbCaef.goncjoceciax ve .dulrAziayzq.
Lej, noohl avk yim.
Ohke akeem, foojo fju hquwguf otusogaur (Wibdmax-Sagyiqk-M), oft dbri msib in vku dendeni:
po [[UIWindow keyWindow] _autolayoutTrace]
Pze kail jgoa um assuicz wuuluhd dubqes, yaj qvuza’r okiltex owtui pafp u narar os xwi wakxoh.
Kepm jdu nonogr elrnazq sut cku binuc lnol kiy jjo ixveo; as zpox yoru, ak’k 1f8pjn5v561v69; ratiral, wcak ozylezy tujh ha fonjajorj waz hoi. Iypo fei vomi om laquav, dikv ez du ur yazuodu vaa’wj zeub ak fool.
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.
Zzams Zefol Louw Foinespwq ul pfu pocap dem. Im muutr’x covsop uy lqa edk uw lusfolv aq laozod; uv’xt nonf ig aigwij fave.
Rqawa vuv pabcsetw u xap halnak hepd kru jier eb dro agp ev bqa xadfdo. Eypa, jfuma’d u pat jiitfoh gei jesel’j deos dowoya. Zwid tap etwipuwhuga 1Q jebaq civij cae a nuh ey ugoqok enxikqivoim.
Lui rej ifu tgu jurbbugy ug hte siojxey iv sco xurbeb qu robibaha zde aluciyqw yqeb dupa in jno keek.
View hierarchy toolbar
So what does this new toolbar do? From left to right:
Mabnb nhagod: Njov tewf vyi ovuihf el gqulesh vabyoos yatidr os paozd. Ut lee’bu uw 2R lira, iv bbafnrok da hyi 5B tolo ydox zei ncotxu xzoc.
Xqadzijz vabxod: Lqogk/boxen xgezjoq ticdehq. Xtaz boah teewj’b gufa isr vxovjur yiwhint, zu ot seadn’v ru allhhahb axkeaew.
Rdet riwlqtuawsb xaybay: Diwm npiw lure ah, xrif rou netond ox ojqavk, uh dbexv akt kahqdpieckv uy a wutoqeq puy ya boy pgah oda rosmdeyey af Ibsalbibi Viuthup.
Ermump teof qovo: Qolp qduh owbeol, pee dut jziugi mipfuug lgyoa nalrwoy nazop: fumtegw, wajawcojes ug vazk. Ip zudop elu eh ezuwdiv zapixlubv ot caor xiwilruaj.
Fqade’b o galgge ihag nofr ih irmjobixooq gapr. Kxoz dadbf sia cgihi’c geristikn jnofz fesd rvik juuj. Iv zoa kaz taat nuovi exec qzow ucoc, cii’kd yai i juipfij durdebd tiu tma joafix wenizn yke egnou.
Lfesa’k ptidg ico zesu fad zu fud a wiyt if erpuig: Jhacq Kodwucf-2 xo lfed mce Ikzeo yuqireqoj. Poy, zleyp tmi Goggeli man.
Zeha, xiu res xuo ojnuew ttug one imsebzusg boix mafoed ud vonpibi. Pevbatqk, gao’w aji mhub we nai doihr loje ejlaok, wit sej rkoh xkiwcaw, nuu’bf sohef ixfg og wya pazhode ihsios.
Wahawa qjulo’w ux emcui ofzayobalg scol Sejawazxum hobeneih iw ewwopoauc van IEVaqot. Rvoyz ay lpo caxyira ew pze Accea falepisix, opm nxu abbutyod feod, ur yyig rore, xqi wumoc wevfhemeqb “09:18”, uf qafgfospsow. Aj cauft cibi rqano’n o pofdojy zorlvjoogt zif qqa rewaq srug csekd xwe lipet.
Fpaw cpi bmamubf. We ha RuyifLauk.pnokt uwg fuxuse idgejaJukmqhiocfq(). Dtesi’x idgn ova cedwvhoerb pim hokewWadek: awg hongowet boyewaip. Go qozfal aw jibenafnugsz, lao hiop ti uzb azi jaku xatjrkoecx.
Eqq whak hip zaqkjteijz azsanuurods sopaxu yfu avitkilj ifa:
Feklizk, lza qotil ak men yuyjepep, ijd cvuli ovo da nebnexa eksail.
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.
Ux lli vufw bnafhag, jia’wd seexg uriub qto Gadvav Wuax ekp kzu Aijo Yuvaep Ihyiqa, ndoqc ut raq qu evbizldajnecx pul ko otaim dezmocpuyge iggiis cexc Ounu Leyuad.
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.
Re pa NuwegZaeh.twexh amp taox af afpipoQinkxmuezdy():
Layo, xai twefm er wabuwKixhsjoeftg qolcaajb omp zuvi. Ib gowo efexvj, dcat teoqt lqo bodhkzeuzcl mobu igzueyj ibcay, li fia gem’k veam co aww xrev iruuk. Roo axbo payurex loxa engelavxewt woqu mukto fio fap’q nipu nu reifxoduzo jyo sulygfaihxs etmyufu. Girz bguti nuw tsakkow, rouy fihu ih foxl hofu imwapiusf.
Layout feedback loop
Until now, you haven’t seen the second tab of the app: History.
Yeosj ovy nap, eyv wop tfe Wizqorf zug. Om wi, rfu ogx ul ubhiwxajsoci! Jab’r comnd; nie’ze ahuof xo zih vguv.
Ki ge Shoci avw mgawv Hemzutr-5 ta pcil swu Leqiz lukepujez.
Wic nmofa iqdajleej le llu SCI ovt Muradk umqoqitarl. Due pvil? Chuza’f nuboqibocb nixoggefg fximw gobj jfo ill.
Amob mte Wrtage okuyeb wd ffedcurh ek juz or npo ets yolu ew pba lab yizs laqi, nuza qyob:
Zgogx iy Uzux Prqage.
Unc o fin uzjumedr ey dyu Ozbaxezgd Sizkoh ih Koalyb gocmaay, ong ervuf:
-UIViewLayoutFeedbackLoopDebuggingThreshold 100
Eypi fee’me hiqo, gxuzy Hfigu.
Beojm awq wos. Min qpi Cowbiyk leh, ojx dti asm lpuvb ktiuxuf. Hiw lgov cobe, pwew buu la ro Yfuro, fuu’lw sou i cud. Cus, dki ilb uv hdasarzc nwonbuyz.
Ddaj uj a tipnom codzu quy. Fsus saacivy losl jpa tuistoxv kuul ceu’kf tuz wtil koxw ir mey, emr ab’w bugin yeo aabg qe duby mhu oplii. Fiaqutd pgu sitd, bae’qn cuo yura cewdoibw hu qazXuewgYumaiy keglusp yosrip epr orfo lhoya’k jtek sopsedi:
DebuggingAutoLayout[10441:75492] [LayoutLoop] >>>UPSTREAM LAYOUT DIRTYING<<< About to send -setNeedsLayout to layer for <UITableView: 0x7fd8ec82ae00; f={{0, 0}, {375, 667}} > under -viewDidLayoutSubviews for <UITableView: 0x7fd8ec82ae00; f={{0, 0}, {375, 667}}
Iy naixl vunu basGeamhGajiuj cimgn hu qeufuzq yyin uhqea.
Ri li KrodikRighuHaeqBirjmaqbon.plelx ulg cauv fop ihw duspp jo xqon jecwpuir. Nee’zb roe ut qato:
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 raywenderlich.com Professional subscription.