描述:
storyboard上面的約束出錯,但拖線的時候不報錯。
運行的時候出現(xiàn)提示...UIViewAlertForUnsatisfiableConstraints。
以下兩個地址的解決方法很完美。
http://stackoverflow.com/questions/26389273/how-to-trap-on-uiviewalertforunsatisfiableconstraints
http://staxmanade.com/2015/06/debugging-ios-autolayout-issues/
http://nshint.io/blog/2015/08/17/autolayout-breakpoints/
要點:
UIViewAlertForUnsatisfiableConstraints//斷點名
po [[UIWindow keyWindow] _autolayoutTrace]//斷點動作
expr((UIView*)0x7f88a8cc2050).backgroundColor=[UIColorredColor]//命令查找約束有問題的視圖
示范:
首先我們創(chuàng)建一個約束錯誤的例子,把測試的testView添加上下左右四個約束之后,再多增加一條與父視圖居中的約束。

然后我們運行。發(fā)現(xiàn)debug區(qū)域有提示:

其實里面已經(jīng)寫清楚了原因以及相應的查找問題的方法。
首先我們創(chuàng)建一個symbolic斷點。
斷點名就是UIViewAlertForUnsatisfiableConstraints
觸發(fā)斷點的操作就寫 po [[UIWindow keyWindow] _autolayoutTrace]


這個設置就是發(fā)現(xiàn)約束錯誤的時候自動打印相關的信息。
因為我這個demo還沒有顯示出現(xiàn)就已經(jīng)報錯了。。。沒有keywindow。。所以顯示是nil。。。
我們可以直接暫停。。然后在調(diào)試區(qū)輸入上面的命令,如圖:

按下回車之后,相關信息就出來了。。

這個時候我們再結合之前的提示,也就是橙色字里面的這一句,很重要。

表明系統(tǒng)幫你把這個多余的約束移除了。。。約束的相關信息也在上面。。。你再結合剛才po出來的信息,就能很快找到這個view在哪一層。比如,提示中? 0x7fc135408a30 這個內(nèi)存地址,在我們po出來的層級關系里面是最上面的一層,因為我們這個demo最上面的一層就是藍色的testview。。。所以我們可以快速判斷是這個view上面的某個約束出了問題。。如果同層級的view比較多,難以判斷,我們可以通過改變view的顏色,直觀地看出來是哪個view


我們還可以通過打印約束相關的信息,快速定位具體是view上面的哪個約束。。。
打印發(fā)現(xiàn)是constant為52的約束被移除了。。


就這樣??