对于使用AutoLayout来布局的开发者来说,使用AutoLayout进行多个文字或图片自适应高度是一件比较舒服和省事的方式,而最近朋友开发遇到了一个需求就是文字是可变的,需要自适应高度,并且存在一个展开和收起的按钮,需要将视图隐藏起来。因为关联了其它视图,所以这里不能直接设置hidden,只能设置高度为0。初听到这个需求想到的是通过将视图的高度拉线出来在代码中手动修改。发现这样做失去的高度自适应文字的优势,高度还需要根据文字内容手动算,觉得这种方式不够优雅,于是想到了利用约束的priority来解决问题。接下来是看图说话


黄色的是标题文字Label,蓝色的是内容文字Label, 下面是透明的高度固定的一个View, 红色的是背景View。红色的View是被3个视图的撑开的,也就是它的高度是3个视图高度的和。同时我给了红色背景一个高度为0的约束,此时必然会报错。修改height的优先级,修改Priority的值为Low:250, 此时错误修复,视图高度依然是自适应子视图的高度。

因为中间部分是固定高度,需要将其高度的优先级降到中间级别,即将其height的Priority设置为750。

接下来将这个高度约束拉出来,需要视图显示时将Priority设为最低常量值UILayoutPriority.defaultLow,OC中是声明的常量。需要隐藏视图时将Priority设置为大于750小于UILayoutPriority.required的值。这里需要注意的是不能设置为UILayoutPriority.required,否则会奔溃。具体是优先级不能从非必需变为必需,或从必须变为非必须,将添到视图上的约束设置为较低后更改为required会报异常。但可以从可选优先级更改为另一个可选优先级。

感觉这种实现方式是不是更优雅,舒服。如果还有其他想法可以一起谈论。效果图:

网友评论