浅析 ContentSizeFitter 以及 Horizontal Layout Group 嵌套问题

最近写UI时遇到一个问题,现在需要一个根据内容自动改变大小的信息显示列表,大致样子类似这样


其中描述词条可不断增加,外层又需要套一层Scroll View 进行滑动控制,这就要求整个列表按内容自动改变竖方向的大小。但实际在嵌套过程中遇到了问题。由于有多层的嵌套机制。存在一个问题,当这样的节点结构时,父节点TextRoot的大小是不能被控制的,因为只有子节点存在Text组件,可以自动处理大小,但是父节点的大小不能改变。又因为,在总节点上使用了Horizontal Layout Group 这个组件只能控制和遍历一层子节点,自动适应组件在textRoot节点下的text节点,textRoot不能自动改变大小,所以会出现错乱。
最终处理方法为新加一个脚本,让TextRoot父节点根据子物体控制大小改变。


ContentSizeFitter,于是去了解了一下ContentSizeFitter的源码。
ContentSizeFitter的主要流程如下:浅析 ContentSizeFitter 以及 Horizontal Layout Group 嵌套问题_第1张图片
浅析 ContentSizeFitter 以及 Horizontal Layout Group 嵌套问题_第2张图片实现了这个ILayoutElement接口的组件,会进行计算对应的min、preferred、flexible 属性(水平和竖直两个方向)。ContentSizeFitter调用在LayoutUtility工具类中的方法进行处理,对当前物体中实现了ILayoutElement接口的组件进行遍历,根据优先级大小,获取min、preferred、flexible 属性(水平和竖直两个方向)。根据ContentSizeFitter中的设置,处理当前物体设置为min、preferred、flexible 属性中的哪个属性。

 



实现ILayoutElement接口的组件 
Image浅析 ContentSizeFitter 以及 Horizontal Layout Group 嵌套问题_第3张图片 Text浅析 ContentSizeFitter 以及 Horizontal Layout Group 嵌套问题_第4张图片 Layout Group 类 浅析 ContentSizeFitter 以及 Horizontal Layout Group 嵌套问题_第5张图片浅析 ContentSizeFitter 以及 Horizontal Layout Group 嵌套问题_第6张图片浅析 ContentSizeFitter 以及 Horizontal Layout Group 嵌套问题_第7张图片
HorizontalLayoutGroup和VerticalLayoutGroup计算过程比较复杂,总之就是会遍历所有的子物体(只会遍历一层的深度)的大小,有一个选项为是否控制子物体大小,如果控制重新计算,不控制则用原有的大小,加在一起后,为总的min、preferred、flexible的大小。(之后有时间会写新的一篇文章)

你可能感兴趣的:(unity)