真Unity之UGUI——ContentSizeFilter的MinSize和PrefferedSize区别

目录

分析了半天

其他博主分析

一.浮动

二.拉伸

三.动态增长

四.同型嵌套

五.异型嵌套

六.滑动区嵌套


分析了半天

虽然还是不知道区别,但是掌握了一些没用的知识

其他博主分析

从表面上看,unity5.6的和unity5.3的布局功能没有太大的差别,其中VerticalLayoutGroup,只比unity5.3多两个参数即否控制子对象的宽度或高度.但在使用的时候可以实现的效果就远远超过默认控制宽度和高度的布局器强大多了.对于多层嵌套的布局来说,实际上难度还是有比较大的,毕竟一个组件多两个参数,多嵌套几层就复杂了不少.不过越复杂的东西往往灵活性也就越大.

一.浮动

 

这是一个水平方向的布局,内部的元素都有各自的尺寸,而这个布局节点本身的尺寸没有大小的控制,也就是说,如果不控制child的尺寸也不强制展开child,那么每个child都可以有自己想有的尺寸,当有新的child创建到下面是会自动进行排列布局.

二.拉伸

 

如果是垂直布局,在选择控制child的高度和强制展开child高度时,这个布局的尺寸会影响每个子元素的尺寸.在此情形下,再选择宽带控制,会有类似的效果.

三.动态增长

 

在更多的情况下,需要动态控制布局整体的尺寸,这时候需要使用到ContentSizeFitter组件.以垂直方向动态增长为例,可以勾选VerticalFit为PreferredSize 或 MinSize.

四.同型嵌套

布局内的布局使用的动态增长方案和根节点的布局相同,但可自定义子对象的尺寸控制方案.

 

由于直接控制的元素身上没有图片作为尺寸信息,这时候需要挂LayoutElement脚本来标记尺寸信息(在没有动态增长时,如果布局有控制尺寸的权利,那么设置最小值有利于不会被其他没有最小值的元素挤压到没有,设置FlexibleHeight有利于空间充足时的填充)

 

五.异型嵌套

 

以上为在一个垂直布局中嵌套了一个水平布局,同时需要动态增长水平和垂直,所以需要同时进行控制.

六.滑动区嵌套

 

由于滑动区本身有固定的尺寸,不然就没有了滑动的意义,但有时候需要一个滑动区内部放置多个滑动区,这时候也没有会特别的,只不过将每个滑动区对象上多加个尺寸控制的脚本防止被压坏就好了

这里还可以利用flexible设置各个滑动区的相对高度,当然也是没有设置动态增长的情况下.

Unity中,如果你想监听 `Vertical Layout` 的布局改变事件(例如子元素的变化、大小调整等),你可以通过以下几个步骤实现: ### 1. 使用 OnValidate 或其他生命周期函数 如果你希望检测某个对象发生更改并响应它,可以尝试使用 Unity 提供的对象编辑回调方法如 `OnValidate()`。这个方法会在组件值发生变化时触发。 ```csharp void OnValidate() { // 检测垂直布局组是否有变化,并做出反应 } ``` 不过需要注意的是,这种方法仅适用于场景编辑模式下的交互调试;运行时无效。 --- ### 2. 监听 RectTransform 变化 (CanvasRenderer) 如果需要实时监控 `RectTransform` 尺寸是否发生了变更,则可通过订阅 CanvasRenderer 的 geometryChanged 回调完成此目的: ```csharp using UnityEngine; public class VerticalLayoutListener : MonoBehaviour { private void Start() { GetComponent<CanvasRenderer>().SetMaterialDirty(); GetComponent<CanvasRenderer>().RegisterCallback("geometryChanged", () => { Debug.Log("Vertical Layout Geometry Changed!"); HandleGeometryChange(); // 自定义处理逻辑 }); } private void HandleGeometryChange() { // 这里添加具体的业务逻辑... } } ``` **注意**: 此法依赖于 UGUI 系统内部机制,在某些版本可能存在兼容性问题,请根据项目实际测试效果选用。 --- ### 3. 继承自 ILayoutElement 并重写 CalculatePreferredSize MinSize 方法 还可以让脚本直接参与到 UI 布局计算流程当中去,进而捕获到所有可能导致最终呈现结果改变的信息源点。比如我们创建一个新的 MonoBehavior 类型并且使其满足接口要求即可做到这一点了 ```c# using UnityEngine; using UnityEngine.UI; [RequireComponent(typeof(RectTransform))] public class MyCustomVLCatcher : MonoBehaviour, ILayoutSelfController { public void SetLayoutHorizontal() {} public void SetLayoutVertical(){ // 当每次重新排版的时候都会自动进入这里. Debug.Log ("My Custom VLC Has Been Relayouted !"); } } //然后只需将该脚本附加至目标 GameObject 上面就可以了。 ``` 以上几种方式都可以有效地帮助开发者捕捉来自 `VerticalLayoutGroup` 引发的各种改动通知信息。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

avi9111

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值