300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > UGUI_输入框Inputfield中英文字符限制 选中替换

UGUI_输入框Inputfield中英文字符限制 选中替换

时间:2020-07-07 00:33:40

相关推荐

UGUI_输入框Inputfield中英文字符限制 选中替换

直接在面板上设置存在的问题:

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;}

把上面代码放在一起,根据自己项目调试下就可以使用了。

参考链接:Unity之TMP_InputField-输入字符数限制_彩色墨水的博客-CSDN博客

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。