iOS 通过设定约束优先级来改变 Layout 时的动画.
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS 通过设定约束优先级来改变 Layout 时的动画.相关的知识,希望对你有一定的参考价值。
参考技术A控件的内置属性. 像 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
iOS 约束:如何给 UILabel 高度约束优先级
【中文标题】iOS 约束:如何给 UILabel 高度约束优先级【英文标题】:iOS Constraints: how to give UILabel height constraint priorities 【发布时间】:2016-07-21 11:11:33 【问题描述】:我有以下问题: 我有一个固定高度的视图。在这个视图中,有两个单行 UILable。视图比两个标签都大,所以我希望它们像这样显示:
我添加了三个约束来实现这一点:
查看顶部的第一个标签顶部 第二个标签顶部到第一个标签底部 第二个标签底部查看底部(如果你愿意,我可以为此添加代码,但我认为它很明显)
所以现在问题来了。有时视图按预期呈现,但有时呈现不同:
这种行为是相当随机的。 我认为这是因为,两个 UILabel 都有一个(自动生成的)具有相同优先级的高度约束。有时,第一个标签的尺寸正确,有时第二个标签的尺寸正确。 那么有没有办法改变那些自动生成的高度约束的优先级或其他方式来实现这种布局? (我不想为第二个 UILabel 使用容器视图)
最好的问候
【问题讨论】:
【参考方案1】:您的约束不明确,因此是随机结果。您还没有指定应该如何使用高度。
您应该通过将顶部标签的垂直拥抱优先级设置为高于底部标签的垂直拥抱的值来指定。
【讨论】:
感谢您的提示!我不知道内容拥抱,因为这是我第一次使用约束。这对我帮助很大!以上是关于iOS 通过设定约束优先级来改变 Layout 时的动画.的主要内容,如果未能解决你的问题,请参考以下文章
ios UITableView设置tableHeaderView时发生约束错误 UIView-Encapsulated-Layout-Height UIView-Encapsulated-Layout