自学内容网 自学内容网

unity 下拉列表根据内容长度进行 下拉列表长度的自适应

unity 下拉列表根据内容长度进行 下拉列表长度的自适应

输入内容之后,如果内容的最大长度大于MaxDropdownTextCount 则使用最大长度MaxDropdownWidth , 并且将多的字符串设置为.... 如果小于最小长度MinDropdownTextCount 则下拉列表长度是MinDropdownWidth 。 如果在最大和最小中间 使用WidthMultiplier 计算长度,都是根据下拉列表中最长的字符串进行计算的!不是根据新增加的计算。
在这里插入图片描述

UI布局
在这里插入图片描述

using System.Linq;
using TMPro;
using UnityEngine;
using UnityEngine.UI;

public class NewBehaviourScript : MonoBehaviour
{
    public TMP_Dropdown dropdown;
    public Button addButton;
    public TMP_InputField inputField;
    public Button clearButton;

    // 下拉框文本长度限制
    private const int MaxDropdownTextCount = 30;
    private const int MinDropdownTextCount = 10;

    // 下拉框宽度计算常量
    private const float WidthMultiplier = 5f;
    private const int MaxDropdownWidth = 300;
    private const int MinDropdownWidth = 150;

    private void Start()
    {
        // 添加监听器到添加按钮,用于添加新的下拉框选项
        addButton.onClick.AddListener(() => AddDropdownOption(inputField.text));

        // 添加监听器到清除按钮,用于清除所有下拉框选项
        clearButton.onClick.AddListener(ClearDropdownOptions);
    }

    /// <summary>
    /// 添加一个新的选项到下拉框。
    /// </summary>
    /// <param name="newOptionText">要添加的新选项的文本。</param>
    private void AddDropdownOption(string newOptionText)
    {
        if (!string.IsNullOrEmpty(newOptionText))
        {
            // 如果文本超过最大允许长度,则截断文本
            var truncatedText = TruncateText(newOptionText, MaxDropdownTextCount);
            dropdown.options.Add(new TMP_Dropdown.OptionData(truncatedText));

            // 更新下拉框大小以适应新选项
            UpdateDropdownSize();
        }
    }

    /// <summary>
    /// 清除下拉框中的所有选项。
    /// </summary>
    private void ClearDropdownOptions()
    {
        dropdown.ClearOptions();

        // 清除选项后更新下拉框大小
        UpdateDropdownSize();
    }

    /// <summary>
    /// 根据最长的选项文本更新下拉框的大小。
    /// </summary>
    private void UpdateDropdownSize()
    {
        // 计算下拉框的宽度并将其限制在最小和最大宽度之间
        int width = Mathf.Clamp(CalculateDropdownWidth(), MinDropdownWidth, MaxDropdownWidth);
        dropdown.GetComponent<RectTransform>().sizeDelta = new Vector2(width, 30);
    }

    /// <summary>
    /// 根据最长的选项文本计算下拉框的宽度。
    /// </summary>
    /// <returns>计算出的下拉框宽度。</returns>
    private int CalculateDropdownWidth()
    {
        string longestOption = GetLongestOptionText();
        int length = longestOption.Length;

        // 根据最长的选项文本长度计算下拉框的宽度
        return MinDropdownWidth + (int)(Mathf.Max(0, length - MinDropdownTextCount) * WidthMultiplier);
    }

    /// <summary>
    /// 获取下拉框中最长的选项文本。
    /// </summary>
    /// <returns>最长的选项文本。</returns>
    private string GetLongestOptionText()
    {
        // 使用LINQ查找最长的选项文本
        return dropdown.options.Select(option => option.text).OrderByDescending(text => text.Length).FirstOrDefault() ?? "";
    }

    /// <summary>
    /// 如果给定的文本超过最大允许长度,则截断文本。
    /// </summary>
    /// <param name="text">要截断的文本。</param>
    /// <param name="maxLength">文本的最大允许长度。</param>
    /// <returns>截断后的文本。</returns>
    private string TruncateText(string text, int maxLength)
    {
        // 如果文本超过最大长度,则截断并在末尾添加"..."
        return text.Length > maxLength ? text.Substring(0, maxLength - 3) + "..." : text;
    }
}

原文地址:https://blog.csdn.net/GoodCooking/article/details/143734207

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!