描述:
storyboard上面的约束出错,但拖线的时候不报错。
运行的时候出现提示...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]//命令查找约束有问题的视图
示范:
首先我们创建一个约束错误的例子,把测试的testView添加上下左右四个约束之后,再多增加一条与父视图居中的约束。
然后我们运行。发现debug区域有提示:
其实里面已经写清楚了原因以及相应的查找问题的方法。
首先我们创建一个symbolic断点。
断点名就是UIViewAlertForUnsatisfiableConstraints
触发断点的操作就写 po [[UIWindow keyWindow] _autolayoutTrace]
这个设置就是发现约束错误的时候自动打印相关的信息。
因为我这个demo还没有显示出现就已经报错了。。。没有keywindow。。所以显示是nil。。。
我们可以直接暂停。。然后在调试区输入上面的命令,如图:
按下回车之后,相关信息就出来了。。
这个时候我们再结合之前的提示,也就是橙色字里面的这一句,很重要。
表明系统帮你把这个多余的约束移除了。。。约束的相关信息也在上面。。。你再结合刚才po出来的信息,就能很快找到这个view在哪一层。比如,提示中 0x7fc135408a30 这个内存地址,在我们po出来的层级关系里面是最上面的一层,因为我们这个demo最上面的一层就是蓝色的testview。。。所以我们可以快速判断是这个view上面的某个约束出了问题。。如果同层级的view比较多,难以判断,我们可以通过改变view的颜色,直观地看出来是哪个view
我们还可以通过打印约束相关的信息,快速定位具体是view上面的哪个约束。。。
打印发现是constant为52的约束被移除了。。
就这样〜〜