所以我有一个带有文本的按钮。我正在通过脚本更新文本。有些按钮的文本比其他按钮多,所以我将其设置为“自动大小”。但即使这样,有时文本也不适合按钮,所以我希望按钮变大以适合文本。
问题在于垂直布局组和内容大小调整器。 TMP_Text 会增长,按钮也会增长,但它会以最大字体大小增长(即使打开自动大小),理想情况下,我希望它仅在缩小到尽可能小的大小后才增长。
我已经尝试了很多不同的可能性,包括垂直布局组、布局元素和内容大小调整器,但我完全不知道如何让它做我想做的事。
我还注意到这种情况发生在空格上。如果我有一个单词之间没有空格,它似乎可以正确缩放。
编辑:所以我想我该如何让自动调整大小来处理空间?
设置:
┓ 容器
┗┳ 按钮
... ┗ TMP_Text
容器和所有按钮都具有“控制子尺寸”的 VerticalLayoutGroup 和“VerticalFit”设置为“首选尺寸”的 ContentSizeFitter
具有“autoSize”的 TMP_Text 的首选高度基于最大字体而不是最小字体。
您必须使用 LayoutElement 覆盖首选高度。以下 MonoBehaviour 类控制应添加到每个 TMP_Text 的 LayoutElement:
using TMPro;
using UnityEngine;
using UnityEngine.UI;
[RequireComponent(typeof(TMP_Text))]
[RequireComponent(typeof(LayoutElement))]
[ExecuteInEditMode]
public class PreferMinSize : MonoBehaviour
{
TMP_Text tmp;
LayoutElement layout;
[SerializeField, Tooltip("Minimum height of the text")] float minHeight = 50;
private void OnEnable()
{
tmp = GetComponent<TMP_Text>();
layout = GetComponent<LayoutElement>();
tmp.OnPreRenderText -= OnTextChanged; // prevent adding multiple times
tmp.OnPreRenderText += OnTextChanged;
OnTextChanged(tmp.textInfo);
}
private void OnTextChanged(TMP_TextInfo info)
{
if (!this.enabled)
return;
if (tmp.enableAutoSizing == false)
return;
// get minimum height needed for min font size
tmp.enableAutoSizing = false;
tmp.fontSize = tmp.fontSizeMin;
// set height of min font, but with a capped min size
layout.preferredHeight = Mathf.Max(tmp.preferredHeight, minHeight);
// restore behaviour
tmp.enableAutoSizing = true;
}
private void OnDisable()
{
tmp.OnPreRenderText -= OnTextChanged;
}
}
将此组件添加到按钮文本后,您可以设置“minHeight”参数来设置最小高度,文本将缩小到最小字体大小以填充最小高度,只有在此之后才会扩展文本。