Unity:如何让ScrollRect自适应内容高度同时设置最大高度限制
实现方案
以下是Unity UGUI环境下的完整实现步骤:
1. 层级结构确认
首先确定UI层级如下:
- 外层容器(容器1)
- ScrollRect(容器2)
- Viewport
- Content
- 文本组件(Text/TMP_Text)
- Content
- 滚动条(可选)
- Viewport
- ScrollRect(容器2)
2. 各组件属性配置
外层容器(容器1)
- 添加
Content Size Fitter组件:- 水平适配:根据需求选择
Unconstrained(固定宽度)或Preferred Size(自适应宽度) - 垂直适配:选择
Preferred Size
- 水平适配:根据需求选择
- 如果容器1内还有除ScrollRect外的其他元素,可添加
Vertical Layout Group组件,自行调整内边距和子元素间距
ScrollRect(容器2)
- 基础属性设置:
- 取消勾选
Horizontal,仅保留Vertical滚动 Viewport关联对应视口对象,Content关联对应内容对象
- 取消勾选
- 锚点设置为父节点顶部对齐,Pivot设置为
(0.5, 1),保证高度向下延伸
Content对象
- 添加
Content Size Fitter组件:- 水平适配:
Preferred Size - 垂直适配:
Preferred Size
- 水平适配:
- 添加
Vertical Layout Group组件:- 勾选
Control Child Size的Width和Height - 勾选
Child Force Expand的Width,取消勾选Height - 自行调整内边距、行间距参数
- 勾选
- 锚点设置为Viewport顶部对齐,Pivot设置为
(0.5, 1)
文本组件
- 勾选文本的
Auto Size(TMP文本),或设置为自动换行模式,保证文本高度会随内容自动计算
3. 最大高度限制脚本实现
UGUI原生的ContentSizeFitter不支持最大高度限制,所以需要添加一个简单的控制脚本,挂载到ScrollRect对象上:
using UnityEngine; using UnityEngine.UI; [RequireComponent(typeof(ScrollRect))] public class ScrollRectMaxHeight : MonoBehaviour { [Header("最大高度限制")] public float maxHeight = 400f; private RectTransform contentRt; private RectTransform scrollRt; void Awake() { scrollRt = GetComponent<RectTransform>(); contentRt = GetComponent<ScrollRect>().content.GetComponent<RectTransform>(); } void Update() { // 强制刷新布局获取最新内容高度 LayoutRebuilder.ForceRebuildLayoutImmediate(contentRt); // 滚动框高度取内容高度和最大高度的较小值 float finalHeight = Mathf.Min(contentRt.sizeDelta.y, maxHeight); scrollRt.sizeDelta = new Vector2(scrollRt.sizeDelta.x, finalHeight); } }
你可以根据需求调整maxHeight参数的数值,设置需要的最大高度阈值即可。
效果验证
- 文本内容较少时:Content高度小于最大高度,ScrollRect高度和Content一致,外层容器跟着自适应缩小,无滚动效果
- 文本内容较多时:Content高度超过最大高度,ScrollRect高度固定为设定的最大高度,内容超出视口范围,滚动条自动生效可以滑动查看内容

内容的提问来源于stack exchange,提问作者Ryan Pergent
相关产品推荐
相关产品推荐

