问题描述
我有一个带有..的游戏对象(InfoBox)。
- 垂直布局组(四边各占20,有效控制子尺寸大小)
- 图片
- 内容大小适合者(垂直拟合设置为首选大小,水平不受限制)
此InfoBox内是一个Text-Element,每次我更新文本时,我都希望InfoBox展开或折叠,但只能扩展到底部。现在,我的InfoBox始终会在顶部和底部同时展开或折叠,但是我不希望这种情况发生。我该如何实现?我添加了一些屏幕截图,以更好地形象化这一点。
这些是我对信息框的设置:
这些是我对文本的设置:
例如,这是当我使用较少的文本,框从底部和顶部折叠时发生的情况,但是我希望它固定在顶部(与旁边的绿色框位于同一行)并且仅折叠在底部:
任何帮助都非常感谢!
解决方法
您的主要问题似乎是在父对象上也使用了ContentSizeFitter
。因此,这取决于此父对象与其相应父对象的对齐方式。
我知道这句话听起来很奇怪,但是您所做的基本上是将对齐责任移交给了父母。
=>使您的UI元素与顶部对齐并向下增长。
您只需为此设置
- 锚点最小->
1
- 最大锚点y->
1
- 枢轴y->
1
或直接转到RectTransform
检查器,打开对齐工具并按住 Shift + Alt 并单击顶部对齐:
第二步,而不是使用ContentSizeFitter
,我更喜欢拥有自己的脚本,该脚本仅执行应做的事情,而已。
您可以获得preferredHeight
,它正是您想要的值。
以下脚本仅始终将首选高度应用于文本rect。使用[ExecuteAlways]
也可以在编辑模式下使用。只需将其与GameObject
组件安装在同一UI.Text
上
[ExecuteAlways]
[RequireComponent(typeof(Text))]
[RequireComponent(typeof(RectTransform))]
public class TextHeightFitter : MonoBehaviour
{
[SerializeField] private RectTransform _rectTransform;
[SerializeField] private Text _text;
private void Update()
{
if (!_text) _text = GetComponent<Text>();
if (!_rectTransform) _rectTransform = GetComponent<RectTransform>();
var desiredHeight = _text.preferredHeight;
var size = _rectTransform.sizeDelta;
size.y = desiredHeight;
_rectTransform.sizeDelta = size;
}
}