重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
未设置固定机位。在使用ios约束布局时在不同的手机上底部显示不全的情况是由于未设置固定机位的原因,只需在该系统的设置中进行设置即可。iOS是由苹果公司开发的移动操作系统。
成都创新互联长期为上千多家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为武胜企业提供专业的网站设计、成都网站设计,武胜网站改版等技术服务。拥有10年丰富建站经验和众多成功案例,为您定制开发。
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同学的提议。
才学尚浅,不足之处欢迎与我理论、探讨。
红色view底部先开始距离绿色view顶部50,在没有绿色view的时候,红色view距离蓝色view顶部50。
红色view底部有两个约束,但是优先级数值不一样,如果数值一样的话,会报冲突。这样当一个约束移除后(绿色view移除),低优先级的约束就生效。
对于 tableViewCell 来说,不能靠移除一个view来让低优先级的约束起作用,因为cell是复用的,移除cell上的子view的话,之后的布局会错误。我们可以通过改变优先级约束的数值。注意: 如果要在运行时改变约束优先级的值,约束的优先级不能设置为1000(Required)。
崩溃问题回答
上边的报错原因是你已经设置了优先级是必须的,不能用其他优先级替换。我们可以将两个优先级都设置成非必须的,只是数值大小不同,就可以。
ContentHuggingPriority(抗拉伸优先级)和ContentCompressionResistancePriority(抗压缩优先级)
如图中黄色框圈起来的红色label没有被压缩到了正好将绿色label的内容显示完全了。如果绿色的label的内容再长一些,而红色label的宽度约束有没有设置的情况下,是可以将红色label压缩到看不到的。在这里我是设置了红色label的宽度的约束大于等于50