【问题标题】:Unity3D C#: How to resize an inputfield according the content which is set dynamicUnity3D C#:如何根据动态设置的内容调整输入字段的大小
【发布时间】:2014-12-08 13:18:05
【问题描述】:

我有一个 InputField,当从服务器返回一个字符串时,文本会被填充。我们可以调试整个文本,以便我们正确接收它。但是文本太长,无法放入我们的 InputField。 我基本上需要的是统一提供的内容大小调整器的想法(InputFields 设计不支持内容大小调整器) 目前我们正在尝试使用以下 sn-p 代码更新 InputField 的大小。

var x = new GUIStyle();
var rectTransform = pvText.GetComponent<RectTransform>();
var words = pvText.text.Split(' ');
var currentWidth = 0f;
var currentHeight = 0f;
foreach (var word in words)
{
     var size = x.CalcSize(new GUIContent(word + "A"));
     var height = x.CalcHeight(new GUIContent(word), size.x);
     currentWidth += size.x;
     if (currentWidth >= rectTransform.sizeDelta.x)
     {
        currentWidth = size.x;
        currentHeight += height + pvText.textComponent.lineSpacing;
     }
 }
 rectTransform.sizeDelta = new Vector2(rectTransform.sizeDelta.x, currentHeight);

【问题讨论】:

  • 新版 GUI(即 4.6+)还是旧版 GUI?
  • 新版unity 4.6

标签: c# user-interface text unity3d


【解决方案1】:

Content Size Fitter 添加到您的InputField,它们是占位符和文本 (all children) 在 InputField 中将 On Change Value 设置为 ContentSizeFitter.SetLayoutVertical 来自你的 Input Field

【讨论】:

  • 你能解释一下我试图实现时应该发生的事情,并且当文本换行到第二行时它不会改变输入字段的高度。我将 InputField.OnValueChanged 映射到调用 ContentSizeFitter.SetLayoutVertical 的方法。但是 setlayoutvertical 没有做任何事情。我还缺少什么吗? “他们是占位符……”是什么意思?
  • 1.将Content Size Fitter 添加到您的InputField 2. 将Vertical Fit 设置为首选大小3. 将`On Change Value` 设置为ContentSizeFitter.SetLayoutVertical()
  • 非常感谢你,我什至无法形容这个答案对我有多么有用。
【解决方案2】:

或者把这个 UnityScript 放在 InputField GameObject 上:

#pragma strict

private var inputField : InputField;
private var layoutElement : LayoutElement;


function Awake () {
  inputField = GetComponent.<InputField>();
  layoutElement = GetComponent.<LayoutElement>();
}


// Forces InputField to expand by resizing the background image to the unbounded rect of
// its full text. Remember to set the OnChanged event for the InputField to call this fn.
public function ResizeInput () {
  var fullText = inputField.text;
  var extents : Vector2 = inputField.textComponent.rectTransform.rect.size;
  var settings = inputField.textComponent.GetGenerationSettings(extents);
  settings.generateOutOfBounds = false;
  layoutElement.preferredHeight = new TextGenerator().GetPreferredHeight(fullText, settings);
}

【讨论】:

    【解决方案3】:

    您没有指定字体。需要字体和字体大小来计算正确的高度。

    var x = new GUIStyle
    {
        font = pvText.textComponent.font,
        fontSize = pvText.textComponent.fontSize
    };
    var rectTransform = pvText.GetComponent<RectTransform>();
    var words = pvText.text.Split(' ');
    var currentWidth = 0f;
    var currentHeight = 0f;
    foreach (var word in words)
    {
        var size = x.CalcSize(new GUIContent(word + "A"));
        var height = x.CalcHeight(new GUIContent(word), size.x);
        currentWidth += size.x;
        if (currentWidth >= rectTransform.sizeDelta.x)
        {
            currentWidth = size.x;
            currentHeight += height + pvText.textComponent.lineSpacing;
        }
    }
    rectTransform.sizeDelta = new Vector2(rectTransform.sizeDelta.x, currentHeight);
    

    【讨论】:

      【解决方案4】:

      致 Domotor Zsolti:非常感谢

      我有一些小改动可能会对某人有所帮助:
      我试图创建一个随着正在输入的文本而扩展的输入字段。

      Hierarchy:Scene>画布创建 UI:InputField
      (我删除了 InputField 的 Placeholder ChildElement)
      在 InputField:InspectorPanel:InputField:Text 中输入占位符文本(例如:“txt”)

      层次结构视图:InpitField:Text childComponent
      RectTransform 应设置为拉伸
      (应该已经默认设置)
      文本子组件大小/角应设置在靠近或位于 InputField 角上

      InputField:添加组件:布局:ContentSizeFitter
      ContentSizeFitter: Horizo​​ntalFit > PreferredSize
      现在 InputField 将缩小到文本大小
      如果将占位符文本设置为小于 InputField
      ,则占位符文本会消失 - 通过调整 Text 组件的大小来解决(我花了很多时间认为这是一个错误)

      InputField:Inspector:OnValueChanged
      将 InputField 拖到对象窗口
      + 选择函数:ContentSizeFitter:SetLayoutHorizo​​ntal

      我想要水平扩展,但垂直扩展也可以做到

      再次感谢 Domotor Zsolti,我只是因为他的帖子才知道这一点。

      【讨论】:

        猜你喜欢
        • 2011-04-04
        • 2015-02-23
        • 2017-02-11
        • 1970-01-01
        • 2015-04-08
        • 1970-01-01
        • 1970-01-01
        • 2019-10-31
        • 1970-01-01
        相关资源
        最近更新 更多