直接在面板上设置存在的问题:
1.协同开发时不便于他人配置修改
2.中英文输入字符数相同(eg:6字符限制:abcdef 或 一二三四五六),字符 统计不区分中英文,有时不符合设计需求 -.-
思路
1.现以中英文为例,英文字符在UTF-8的模式下只占1个字符,中文占2-5个字符,如果仅仅进行UTF-8的转换,中文字符占位会有问题。
abcdabcdabcd 12个字符 你好呀哈 12个字符 你好呀哈你好
so,需要加个判断,把中文:英文的字数按1:2进行限制
int SingleCharTrans(char singChar)
{
int leng = System.Text.Encoding.UTF8.GetBytes(singChar.ToString()).Length;
if (leng >= 2)
{
leng = 2;
}
return leng;
}
2.使用inputfield.onValidateInput
,自定义每次输入时的回调函数,在输入框中的每次输入都进行判断,中文+英文的字符数超上限了就停止键入,返回'\0'
3.But,这样做,存在一个细节问题,假如现在输入框内的字符已经输入达上限了,我选中其中的一部分字符进行替换输入(类似重命名的操作时默认全选旧名字),是不能进行输入的,这样显然也不合理。因此还需要再增加选中内容重新输入这样的逻辑
实现方法:使用选中标记的前后位置判断,前后标记不同,则选中了内容,此时应该解除输入限制
第2,3步代码为:
inputfield = xxx.GetComponent<InputField>();
inputfield.onValidateInput += OnDataInput;
char OnDataInput(string text, int charIndex, char addedChar)
{
if (inputfield.selectionAnchorPosition > inputfield.selectionFocusPosition)
{
return addedChar;
}
if (GetTransCharNum(text) + GetTransCharNum(addedChar.ToString()) > m_maxLimit)
{
return '\0'; //返回空
}
return addedChar;
}
int GetTransCharNum(string text)
{
int totalNum = 0;
char[] alrText = text.ToCharArray();
foreach (var item in alrText)
{
totalNum += SingleCharTrans(item);
}
return totalNum;
}
把上面代码放在一起,根据自己项目调试下就可以使用了。