前言
众所周知,UILabel的静态字体是支持表情的,不过需要将表情与文字打包到一个图集中,并且因为受限于静态字体,几乎不适用于中文日文等文字的图文混排。
这几天因为项目需要研究了一下动态字体中使用表情的解决方案,不过好像并没有搜到比较好的方案,最终研究了一下NGUI中的源码,决定采取类似于UIInput生成光标和高亮的做法。
原理
原理基本上就是在UILabel每次处理文本的ProcessText方法中判断当前文本是否含有表情符号,如果有,就在UILabel下添加一个UITexture,并将计算好的顶点坐标和UV坐标写入UITexture中;另外还需要相应的修改NGUIText中计算顶点坐标和UV坐标的类,确保UILabel中文字的坐标空出了表情的位置。
直观一点描述就是,UILabel中只显示文字,UITexture中显示表情,这两个控件叠在一起就形成了图文混排的效果。
从目前达到的效果来看还算不错,需要显示表情时会动态创建UITexture,并不会带来过多的内存开销,另外我给UILabel加了useEmoji这个开关来控制是否检查表情,默认为false,如果某些UILabel需要显示表情,就给设成true就好,当然也可以在代码中修改。
另外我又给UILabel加了emojiAlignment这个属性,可以控制表情和文字的垂直对齐方式,默认的选项是Top,即表情和文字的上边缘对齐;Center则垂直居中对齐;当然比较常见的应该是Bottom对齐,即下边缘对齐。
使用
使用起来也比较方便,只需要实现你自己的EmojiProvider,并赋值给UILabel就可以了。
public abstract class EmojiProvider {
public delegate bool EmojiFilter(string text, EmojiVO symbol);
public EmojiFilter emojiFilter;
public virtual Texture mainTexture {
get {
throw new System.NotImplementedException();
}
}
public abstract bool HasEmojis(string text);
public BMSymbol MatchEmoji(string text, int offset = 0)
{
if (string.IsNullOrEmpty(text))
return <