控件的内置属性. 像 UILabel 会根据自己显示的 text 得出一个 intrinsic size. 普通的 UIView 的 intrinsic content size 的属性都为 0. 可以通过 ovrride 的方式去设置自定义 View 的 intrinsic content size.
iOS 当中的每一个约束都有一个优先级. 当两个约束冲突的时候系统会选择破坏优先级比较低的约束. 如果两个优先级一样, 那么系统就会 随机 地选择一个优先级, 并抛出一个错误:
常见默认的优先级有, 251(CH属性), 750(CR属性), 1000(其他约束). 虽然理论上来说优先级只要是 0 ~ 1000 之间的整数都可以. 但是为了方便, 我们通常只有用比默认属性小 1 的优先级, 比如 250, 749, 999.
前面说到有一些控件拥有自己的 intrinsic content size. intrinsic content size 其实也是一种特殊的约束. 是约束就有优先级. 但是跟普通的约束不同, 对 intrinsic size 的破坏分为两种, 扩大和压缩. 所以 intrinsic size 的优先级是由两个部分组成的. 分为别 Content hugging Priority 和 Compression Resistance Priority.
最近要在 UITableView 是实现一个 Cell 折叠和展开的效果. 基本的思路就是通过 UITableView 的自适应机制, 通过改变约束的高度来改变, 然后通过 TableView 进行update. 简单实现后, 功能倒是没有问题. 但是中间的动画却不是期待的样子.
做了一个 Demo 演示效果.
约束非常简单, Cell 里面有一个 UILabel. Label 有 Top 和 Bottom 的约束, Cell 的高度是自适应的. 当点击按钮的时候会调整 BottomContraints 的数值来实现高度变化.
实现的效果如下:
可以看到在扩大和缩小的时候 Test 2 文字有明显的跳动. 原因在于变化瞬间, 虽然 bottom constraint 的数值发生了改变, 但是 Cell 高度还没有发生改变. 所以这个时候不能满足所有的约束, 那么会选择破坏一个优先级最低的约束. 在垂直方向, 优先级最低的约束就是 Label 的 intrinsic conttent size. 所以在缩小时系统选择扩大了 Label 的大小, 因为文字是居中的, 所以会看到文字的跳动.
从我们的需求的来说, 我们希望系统破坏的是 bottom 的约束. 想到达到这个这个目的, 我们只需要将 bottom 的优先级设成比 Label 的Content Hugging Priority 更低就可以了. 将 bottom 的优先级设成250 以后的效果如图:
Demo 的地址: https://github.com/Guaidaodl/iOS-Demos
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)