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博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShallsenSalt

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值