UnsatisfiableConstraints

描述:

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添加上下左右四个约束之后,再多增加一条与父视图居中的约束。


UnsatisfiableConstraints_第1张图片
错误约束示范

然后我们运行。发现debug区域有提示:


UnsatisfiableConstraints_第2张图片
问题的提示

其实里面已经写清楚了原因以及相应的查找问题的方法。

首先我们创建一个symbolic断点。

断点名就是UIViewAlertForUnsatisfiableConstraints

触发断点的操作就写 po [[UIWindow keyWindow] _autolayoutTrace]


UnsatisfiableConstraints_第3张图片
增加symbolic断点
UnsatisfiableConstraints_第4张图片
填写断点相关信息

这个设置就是发现约束错误的时候自动打印相关的信息。

因为我这个demo还没有显示出现就已经报错了。。。没有keywindow。。所以显示是nil。。。

我们可以直接暂停。。然后在调试区输入上面的命令,如图:


UnsatisfiableConstraints_第5张图片

按下回车之后,相关信息就出来了。。


UnsatisfiableConstraints_第6张图片

这个时候我们再结合之前的提示,也就是橙色字里面的这一句,很重要。


很重要的一句提示

表明系统帮你把这个多余的约束移除了。。。约束的相关信息也在上面。。。你再结合刚才po出来的信息,就能很快找到这个view在哪一层。比如,提示中  0x7fc135408a30 这个内存地址,在我们po出来的层级关系里面是最上面的一层,因为我们这个demo最上面的一层就是蓝色的testview。。。所以我们可以快速判断是这个view上面的某个约束出了问题。。如果同层级的view比较多,难以判断,我们可以通过改变view的颜色,直观地看出来是哪个view



UnsatisfiableConstraints_第7张图片
约束有问题的view的颜色已经变了

我们还可以通过打印约束相关的信息,快速定位具体是view上面的哪个约束。。。

打印发现是constant为52的约束被移除了。。

打印一下约束的信息


UnsatisfiableConstraints_第8张图片
就是它了。。。

就这样〜〜

你可能感兴趣的:(UnsatisfiableConstraints)