gpt4 book ai didi

c# - 如何在获得焦点时禁用 UI.InputField 的 SelectAll() 文本?

转载 作者:行者123 更新时间:2023-12-04 01:49:24 25 4
gpt4 key购买 nike

UI InputField 在获得焦点时突出显示其中的所有文本。我想将插入符号移动到文本的末尾,以便用户可以继续在其中写入文本。目前我有一个 hack 解决方案,它可以工作,但是文本突出显示的时间仍然很短。这是我的技巧:

using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class TextFieldBehaviour : MonoBehaviour, ISelectHandler
{
private InputField inputField;
private bool isCaretPositionReset = false;

void Start()
{
inputField = gameObject.GetComponent<InputField>();
}

public void OnSelect (BaseEventData eventData)
{
isCaretPositionReset = false;
}

void Update()
{
if(inputField.isFocused == true && isCaretPositionReset == false)
{
inputField.caretPosition = inputField.text.Length;
isCaretPositionReset = true;
}
}
}

我也在检查 source code输入字段。但是我在创建没有 SelectAll() 函数的自定义函数时遇到了麻烦。由于 UnityEngine.UI.SetPropertyUtility 的保护级别,我收到了一堆错误。

最佳答案

有一个技巧可以禁用文本突出显示时的短时间。我设法在没有 Update() 函数的情况下重做。

1.获取InputField.selectionColor的颜色。将其 alpha 设置为 0

2。将 #1 中的新颜色应用到 InputField

3.等待一帧。您必须这样做,因为 Unity 插入符等待一帧出现。

4.更改 InputField 插入符位置。

5。将 InputField.selectionColor alpha 更改回 1

public class TextFieldBehaviour : MonoBehaviour, ISelectHandler
{
private InputField inputField;
private bool isCaretPositionReset = false;

void Start()
{
inputField = gameObject.GetComponent<InputField>();
}

public void OnSelect(BaseEventData eventData)
{
StartCoroutine(disableHighlight());
}

IEnumerator disableHighlight()
{
Debug.Log("Selected!");

//Get original selection color
Color originalTextColor = inputField.selectionColor;
//Remove alpha
originalTextColor.a = 0f;

//Apply new selection color without alpha
inputField.selectionColor = originalTextColor;

//Wait one Frame(MUST DO THIS!)
yield return null;

//Change the caret pos to the end of the text
inputField.caretPosition = inputField.text.Length;

//Return alpha
originalTextColor.a = 1f;

//Apply new selection color with alpha
inputField.selectionColor = originalTextColor;
}
}

注意:

将插入符号移动到文本末尾的最佳方法是使用 MoveTextEnd函数而不是 inputField.caretPosition。如果您的文本很长,您会注意到 inputField.caretPosition 的错误。

如果您关心这一点,请将上面代码中的 inputField.caretPosition = inputField.text.Length; 替换为 inputField.MoveTextEnd(false);

关于c# - 如何在获得焦点时禁用 UI.InputField 的 SelectAll() 文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41484725/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com