前言
autolayout玩的不溜老客?autolayout不熟悉缀磕?
不用擔心本篇文章就是介紹一下筆者在工作中調(diào)試autolayout的一個小技巧而已逢享,于autolayout本身技術(shù)并無太大關(guān)聯(lián)鞠值。廢話不多說贪薪,讓我們一起來探險吧叠赐。
來認識一下
在UIWindow
里有一個名為_autolayoutTrace
的私有方法慧妄,該方法返回值是一個字符串对妄,而這個字符串則是包含了UIWindow
中整個視圖的層次結(jié)構(gòu)河绽。而在約束這一塊有問題的視圖己单,_autolayoutTrace會使用AMBIGUOUS layout
標記出視圖并告知你缺少或者某些約束。所以一般情況下用_autolayoutTrace
來調(diào)試約束耙饰,筆者建議直接在控制臺搜索是否存在AMBIGUOUS
字符來判斷約束是否有問題纹笼。
動手練一練
使用該方法最好的方式就是在控制器完全加載完了,并在模擬器或者iPhone上能看到視圖了苟跪,然后讓程序暫停(pause program execution)并在控制臺輸入po [[UIWindow keyWindow] _autolayoutTrace]
在按下回車鍵廷痘,你就能看見神奇的一刻了。
.lldbinit
到目前為止雖然我們想要的效果實現(xiàn)了件已。但是笋额,po [[UIWindow keyWindow] _autolayoutTrace]
在控制臺輸入的時候并未有單詞提示,不過好在這條命令很好記篷扩。當然也還有一個更高級的玩法兄猩,就是在.lldbinit
里為這個命令設置一個別名。之前我寫的文章里也三番五次的介紹過.lldbinit
了,所以在此不再過多贅述枢冤,簡單描述就是Xcode
啟動的時候會去找這個文件鸠姨,而我們可以在這個文件里進行一些LLDB
命令的初始化,比如設置別名等淹真。
在此讶迁,我們創(chuàng)建一個.lldbinit
文件,打開你的終端(terminal)輸入touch ~/.lldbinit
命令核蘸,然后在open ~/.lldbinit
巍糯,不出意外的話文本編輯器打開,然后在此設置別名客扎,在文本編輯里輸入command alias zxp_autolayout_trace po (id)[[UIWindow keyWindow] _autolayoutTrace]
即可
1.如果你之前存在.lldbinit這個文件鳞贷,當你輸入
touch ~/.lldbinit
并不會造成任何影響,所以在此放心使用這條命令虐唠。2.而以上在文本編輯器里的字符串
zxp_autolayout_trace
這是我設置的別名,你們也可以把這個改成你們自己想要的名字惰聂。3.或許你們發(fā)現(xiàn)了
po (id)[[UIWindow keyWindow] _autolayoutTrace]
這里顯示的指定了返回值疆偿,因為之前就有說過此方法返回值是一個字符串,如果不顯示指定返回值則在這兒是不生效的搓幌。所以就返回了一個id
類型杆故。
到目前為止別名就設置完了,在控制臺里就不需要在輸入po [[UIWindow keyWindow] _autolayoutTrace]
這條難看又長的命令了溉愁。而是直接輸入你設置的別名即可处铛,并且還有單詞提示哦。
PS:如上步驟我設置的別名是
zxp_autolayout_trace
所以在控制臺里輸入zxp_autolayout_trace
即可拐揭。
結(jié)語
如果你覺得布局和預期的有點不一樣撤蟆,或者無法確定自己寫的約束布局是否正確,那或許你可以試試這個好玩的小技巧堂污。
20160323補充
老是有人問為何不用Xcode自帶的view調(diào)試功能尼家肯。其實這里想補充的是,那個Xcode的Debug View Hierarchy
是審查UI的盟猖,而非是檢查autolayout
是否有歧義的讨衣。本篇所介紹的重點內(nèi)容是如何揪出autolayout
里的坑。而對于有歧義的約束會有AMBIGUOUS
字符標識式镐,假設你缺少一個height
的約束反镇,AMBIGUOUS就會標注出缺少height。所以本篇內(nèi)容與UI審查無關(guān)更與Debug View Hierarchy
無關(guān)娘汞,如果想要審查UI歹茶,在這里筆者推薦reveal
。
本文歡迎轉(zhuǎn)載,但不要忘了標注原文出處哦辆亏!