上次写了一个控件约束报错,因为上个例子只有一个控件,不具有代表性,所以,这次就找了个控件挺多的例子,这个例子是用第三方库 Masonry,例子截图是这样子的(只是作为例子,所以并不美观,请见谅)

虽然说排版看起来没有错误,但是,运行的时候还是会有约束错误的,

为什么会这样呢?因为我代码中是这样写的。
cell中的控件


换成效果图就是这样的

虽然运行结果看起来排版没有问题,但是谁能保证每次都这样呢,所以最好把约束报错解决掉。
怎么解决呢?
1.打开断点导航(cmd+7)
2.点击左下角的+按钮
3.选择Add Symbolic Breakpoint
4.在Symbol添加UIViewAlertForUnsatisfiableConstraints

再次调试的时候就可以通过LLDB来调试了,然并卵,如果你不知道LLDB的话。
所以交给你一个小技巧,添加
po [[UIWindow keyWindow] _autolayoutTrace](OC项目)
//或
expr -l objc++ -O -- [[UIWindow keyWindow] _autolayoutTrace](Swift项目)。

以上步骤执行完之后,点击运行,因为下了断点,运行以后就是这样

发现第一次运行没有打印出有用的信息,不要气馁,我们继续运行。

继续运行结果是这样的

这两个控件就是比较可疑的,我们可以通过让这两个控件变色来准确找出约束有问题的控件
怎么做呢?只需要在断下的时候在lldb中添加如下命令即可
expr ((UIView*) 0x7f98c2c39d10).backgroundColor=[UIColor redColor] ,输入结束回车
// 一定要回车,不然这句话相当于没有执行,控件就不会变色
expr ((UIView*) 0x7f98c2c180c0).backgroundColor=[UIColor redColor],输入结束回车
两次回车后,是这样的

然后,我们取消断点

点击继续运行

结果是这样的

只要眼神没问题 就知道这是两个 label, 只要写代码的不是太坑,就会有命名规范,我的这里是
contLabel 和 usernameLabel

找到了,就是这两个label,可以看出途中两个约束有冲突(marginW = 10)用数学公式表达出来就是这么个意思
// 在 contentLabel设置的约束
contentLabel.bottom + 10 = usernameLabel.top ;
// 在 usernameLabel设置的约束
contentLabel.bottom + 20 = usernameLabel.top;
两个约束肯定冲突了,把其中一个删掉就可以了,删掉一个后运行,(记住取消断点),结果是这样的

好了,约束冲突解决了。。。。
网友评论