域名和网站名要一样吗,母婴网站建设 社区,自己做的动画买给网站,自己电脑做服务器搭网站常规限定文本长度 ( 通过 UntiyEngine.UI.Inputfiled 附带的长度限定 ) 痛点1
无法对中文#xff0c;数字#xff0c;英文进行识别#xff0c;同样数量的汉字和同样数量的英文像素长度是不一样的#xff0c;当我们限定固定长度后#xff0c;在界面上的排版不够美观 痛点2…常规限定文本长度 ( 通过 UntiyEngine.UI.Inputfiled 附带的长度限定 ) 痛点1
无法对中文数字英文进行识别同样数量的汉字和同样数量的英文像素长度是不一样的当我们限定固定长度后在界面上的排版不够美观 痛点2
当我们需要对用户的名称加限制长度的时候 不同的文本( 汉字字母数字符号 ) 外观上长度不一常规的裁切不够优雅文本看上去也是突然的停顿了比如中间的 “巴拉巴拉小魔仙” “仙” 直接裁切了处理方式太过僵硬
当然我们可以用自动适配来缩小字体来解决以上问题但整体看上去又不够整齐很容易出现大小层次不齐整体看上去会很丑
如何解决呢?
第一个痛点我们可以通过像素的方式以单元格的方式去计算文本实际长度 而非固定长度限制
如: 你好,世界! 占用的是10个单元格 而hello,world 占用的是10个单元格
如上虽然字符串长度不一样但是实际像素却是一样的 ( 这里我们做一个设定 不足一个字母长度的当成一个字母长度, 如 !, ., _,-, 这些都是字母但长度不一我们按最大长度来处理也就是一个英文字母 A的长度来设定 )
如何去判断字符串中有多少个汉字多少个特殊字符呢 我们需要写一个正则表达式来筛选这里我封装了一个类来专门处理
这里我额外处理日文韩文这些长度都是等同于汉字的处理 具体长度计算 我们只需要调用 GetTextSize 方法 大家也可以自行扩展根据实际项目中的字体去更改大小比例有的项目中 英文和汉字的比例是 1:1.5, 我本人的项目字体目前是1:2 所以 文本中汉字的实际大小 字符串包含汉字的数量x2
using System.Text.RegularExpressions;public class LanguageCounter
{// 统计字符串中的中文字符个数public static int CountChinese( string input ){return Regex.Matches( input, [\u4e00-\u9fff] ).Count;}// 统计字符串中的英文字符个数public static int CountEnglish( string input ){return Regex.Matches( input, [a-zA-Z] ).Count;}// 统计字符串中的符号个数包括标点、特殊符号等public static int CountSymbols( string input ){return Regex.Matches( input, [^\u4e00-\u9fff\w\s] ).Count;}// 统计字符串中的数字个数public static int CountNumbers( string input ){return Regex.Matches( input, \d ).Count;}// 统计字符串中的韩文字符个数public static int CountKorean( string input ){return Regex.Matches( input, [\uac00-\ud7af] ).Count;}// 统计字符串中的日文字符个数public static int CountJapanese( string input ){return Regex.Matches( input, [\u3040-\u30ff] ).Count;}// 空格数量public static int CountSpace( string input ){return Regex.Matches( input, \s ).Count;}/// summary/// 获取字符串中 单元大小/// /// 字符/字母/数字 按一个单元算/// 中文汉字,韩文繁体日文,片甲 按两个单元算/// /// /summary/// param nametext/param/// returns/returnspublic static int GetTextSize( string text ){int chineseSize LanguageCounter.CountChinese( text ) * 2;int japaneseSize LanguageCounter.CountJapanese( text ) * 2;int koreaneseSize LanguageCounter.CountKorean( text ) * 2;int englisheseSize LanguageCounter.CountEnglish( text );int symbolsSize LanguageCounter.CountSymbols( text );int numberSize LanguageCounter.CountNumbers( text );int spaceSize LanguageCounter.CountSpace( text );return spaceSize chineseSize englisheseSize symbolsSize numberSize japaneseSize koreaneseSize;}}
如何解决第二个痛点呢
我们只需要限定长度这个长度是实际单元像素长度而非固定字符串长度去处理就行尾号加上 … 就可以完美解决 public void SetName( string newName ){if ( LanguageCounter.GetTextSize( newName ) 12 ){//这里因为你永远也不知道尾部的字符是 汉字韩语 特殊符号 还是字母和数字所以我们只需要遍历去裁切计算长度就可以了//至于性能这里不涉及UI仅仅对数据进行遍历开销可以忽略不记while ( LanguageCounter.GetTextSize( newName ) 9 ){newName newName.Remove( newName.Length - 1 );}newName newName ...;}//在最后我们将筛好的字符串赋值给 UI 就大功告成了nameText.text newName;}
最后感谢大家阅读有什么问题可以通过博客私聊我或者你有更好的方法也可以在博客下留言感谢