AutoLayout使用起来方便快捷,但是当我们的约束设置出现冲突的时候就是非常蛋疼的时候了,下面说说我解决约束冲突的经验。
好吧,现在我们的约束出现问题了,问题出现的原因本质上使我们约束设置的不够完美:1,设置了多余的约束;2,约束的设置没有考虑到界面尺寸的变化;3,前两条都有。
好吧,工程开始报警告了如下:
正常情况下,这样的段落会重复出现多次,看着就蛋疼,让我们来认真分析一下这个log到底想给我们传达什么信息吧。
先看前面的说明
意思是,你的约束设置傻逼了,不拉不拉,你可以这样做:1,一个一个的看你的约束,看看那个跟你想要的不一样;2,找到并修改它。 这两句简直没有一点卵用,谁不知道找到并修改它,关键是怎么找啊,也不给个提示,真是醉了,好吧自己研究吧,我们接着看小括号里面的冲突约束吧,先看第一句
我来凭借我多年经验翻译一下吧:约束:0x13823a560 V:我猜测这里是 vertical 也就是竖直的意思,相应的H就是水平的意思 , "|" 是一个替代符号表示后面的小括号里面的 字典中的内容也就是 内存地址为0x13823920f的UITableViewContentView,|-(0)-[UIView:0x138239490] 就是|到后面这个view 的竖直距离为0 。整句话下来意思就是:地址为0x13823920f的UITableViewContentView 距离 内存地址为0x138239490的UIView 的竖直距离为0的内存地址为0x13823a560约束。整句话修饰的是一个名词。
同理,第二句的意思是:UITableviewCellContentView 到这个lab 的竖直距离为5的约束;第三句的意思:这个UIView倒这个UIlabel 的竖直距离为5;第四句没有V了,并且只涉及到一个控件:UITableviewCellContentView 自身的高度。 根据内存地址我们可以看出总共涉及到了一个view 、一个contentView、一个label三个控件。 然后下面是被破坏的约束:UIView 到 UILabel的竖直距离为5。也就是说,这个约束在运行的时候因为 父视图(UITableviewCellContentView)尺寸的改变不能正常约束控件了。
了解了他这个意思,我们可以从我们的Storyboard 或者Xib文件中寻找出问题的 约束了,怎么找呢,我们可以找关键点,从最后一个被破坏的约束找起,竖直距离为5;而且是 label 跟UIView的,想必不会 有太多,如果有太多可以修改几个排除一下,然后再试着调整一下父视图的size,基本上就能确定我们不合理的约束所在了,不过这个过程仍然是比较麻烦的,因为约束冲突本身就是一件蛋疼的事。
找到了产生冲突的约束之后,设置约束的优先级也是一种很方便解决办法,感谢AmySong同学的提议。
才学尚浅,不足之处欢迎与我理论、探讨。