现在很多App都有自己的自定义的表情,客户端可能要实现自己定表情的选择、发送和显示,这里我介绍一种简单的自定义表情的实现思路和代码。
以下介绍基本可以实现聊天中对自定义表情的需求,可结合下图来理解:

资源准备:

  • 自定义表情图片的命名。
  • 每个自定义表情的意思。
  • emtionMeans.plist:key–表情选择器每个表情对应的tag值,value–每个表情的意思。
  • emtions.plist:key–每个表情的意思,value–每个表情对应的图片。

实现逻辑:

  • 初始化表情选择器,主要根据以上两个plist表格相互转换来获取需要的东西。
    创建一个EmojiView继承自UIVIew,主要代码如下:
-(void)initView{NSString * filePath = [[NSBundle mainBundle] pathForResource:@"emtions" ofType:@"plist"];//表情含义--表情图片NSDictionary * emojDic = [[NSDictionary alloc] initWithContentsOfFile:filePath];//表情含义NSArray * keysArray = @[@"[憨笑]",@"[奸笑]",@"[惊呆]",@"[疑问]"];for (int i = 0; i < keysArray.count; i++) {UIButton * button = [UIButton buttonWithType:UIButtonTypeCustom];button.frame = CGRectMake(20 + i*30, 20, 25, 25);button.tag = 60000 + i;NSString * key = keysArray[i];//根据含义取得表情图片,展示表情[button setImage:[UIImage imageNamed:[emojDic objectForKey:key]] forState:UIControlStateNormal];[button addTarget:self action:@selector(selectEmtionClick:) forControlEvents:UIControlEventTouchUpInside];[self addSubview:button];}
}-(void)selectEmtionClick:(UIButton *)button{NSString * key = [NSString stringWithFormat:@"%d",(int)button.tag];if (self.delegate && [self.delegate respondsToSelector:@selector(selectedEmoji:)]) {//根据tag值获取表情含义[self.delegate selectedEmoji:self.emojMeansDictionary[key]];}
}-(NSDictionary *)emojMeansDictionary{if (!_emojiMeansDictionary) {NSString * filePath = [[NSBundle mainBundle] pathForResource:@"emtionMeans" ofType:@"plist"];_emojiMeansDictionary = [[NSDictionary alloc] initWithContentsOfFile:filePath];}return _emojiMeansDictionary;
}

实例化一个EmojView对象即可得到一个自定义表器的选择器。
接下来我们需要一个辅助器,用来判断某个字符串是不是表情字符串以及某一串字符串中是否包含表情。因为现实表情需要用到富文本,一般对内存和性能的消耗比较大,对于不含表情的字符串我们还是直接UILabel来显示更好些,特别是像聊天这样的布局。显示某条聊天消息之前,我们先判断该消息中是否包含表情字符串,在这里我用的是[]来识别的,如果包含[],我们再进一步通过emtionMeans.plist中表情的含义来对比,看这个[]中的内容是否属于表情,如果这两者都满足,则表示该消息中含有自定义表情。
辅助器主要代码:

+(BOOL)isIncludeEmoji:(NSString *)message{BOOL isInclude = NO;int startLoctaion = 0;int endLocation = 0;for (int i = 0; i < message.length; i ++) {if ([[message substringWithRange:NSMakeRange(i, 1)] isEqualToString:@"["]) {//起始位置startLoctaion = i;}if ([[message substringWithRange:NSMakeRange(i, 1)] isEqualToString:@"]"]) {//结束位置endLocation = i;}if (endLocation) {NSString * expression = [message substringWithRange:NSMakeRange(startLoctaion, endLocation - startLoctaion + 1)];isInclude = [EmojiHelper isEmojiString:expression];if (isInclude) {break;}else{startLoctaion = 0;endLocation = 0;}}}return isInclude;
}+(BOOL)isEmojiString:(NSString *)string{BOOL isExpression = NO;NSString * filePath = [[NSBundle mainBundle] pathForResource:@"emtionMeans" ofType:@"plist"];NSDictionary * expressionMeansDictionary = [[NSDictionary alloc] initWithContentsOfFile:filePath];for (NSString * key in [expressionMeansDictionary allKeys]) {if ([string isEqualToString:expressionMeansDictionary[key]]) {isExpression = YES;break;}}return isExpression;
}

最后我们需要一个可以显示我们的表情的Label,iOS自带的UILabel显然不能直接用,这里我用到了一个第三方MLEmojiLabel,用它来做自定义表情的展示。直接用也会有问题,因为自定义表情的资源不同,要显示自己的话需要做修改,另外也做了一些优化(直接从网上下载的第三方在返回经过表情识别处理的Attributed字符串的方法中对表情字符串的识别度不是很精准)。
不过调用很方便,实例化MLEmojiLabel直接调用下面的方法即可显示自己的自定义表情:

[self.emojiLabel setEmojiText:self.emojiString];

做聊天的话可能需要动态改变Label的高度,需要调用上面的方法之后调用一下下面的方法即可:

CGSize textSize = [self.emojiLabel sizeThatFits:CGSizeMake(SCREEN_WIDTH - 160, size.height)];

以上的代码可根据固定的宽度来获取当前的高度。
完整代码点击这里获取。
demo效果:

iOS自定义表情的实现相关推荐

  1. IM界面高仿微信,android表情转ios表情,支持自定义表情,支持语音(实战界面)

    前言: 2018年底由子公司来到现在的集团公司,从互联网公司变成了企业公司.在最近一个项目里,做的辛辛苦苦,功能又被砍了.没有理由,心力交瘁!本来是打算自己做IM的,现在被砍了.我就把本地功能贡献出来 ...

  2. flutter聊天界面-自定义表情键盘实现

    flutter聊天界面-自定义表情键盘实现 flutter 是 Google推出并开源的移动应用开发框架,主打跨平台.高保真.高性能.开发者可以通过 Dart语言开发 App,一套代码同时运行在 iO ...

  3. 一劳永逸,iOS 自定义 ActionSheet 封装流程

    原文链接:http://www.jianshu.com/p/cfb87a7db7b1 本文为 iOS 自定义视图封装<一劳永逸>系列的第四期,旨在提供封装思路,结果固然重要,但理解过程才最 ...

  4. iOS自定义View 控件自动计算size能力

    iOS自定义View 控件自动计算size能力 背景 在使用 UILabel 和 UIImage 的时候,不用指定宽高约束,控件也不会报约束缺失,还可以根据内容自己确定适合的宽高,特别适合 Xib 和 ...

  5. ios 自定义字体_如何仅用几行代码在iOS应用中创建一致的自定义字体

    ios 自定义字体 by Yuichi Fujiki 藤木雄一 In this article, you'll learn how to create a unified custom look th ...

  6. android 自定义表情包,android基于环信的聊天和表情自定义

    环信sdk的导入 自定义聊天界面 此处只有静态图,请谅解. 自定义表情发送 自定义聊天界面 简单说下自定义的聊天界面,一个带有recyclerview和的xml文件,和对应的adapter即可.rec ...

  7. iOS自定义组与组之间的距离以及视图

    iOS自定义组与组之间的距离以及视图 //头视图高度 - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(N ...

  8. iOS 自定义转场动画浅谈

    代码地址如下: http://www.demodashi.com/demo/11612.html 路漫漫其修远兮,吾将上下而求索 前记 想研究自定义转场动画很久了,时间就像海绵,挤一挤还是有的,花了差 ...

  9. php使用自定义alert,IOS_iOS自定义alertView提示框实例分享,本文实例为大家分享iOS自定义a - phpStudy...

    iOS自定义alertView提示框实例分享 本文实例为大家分享iOS自定义alertView提示框,先上图,弹框的背景色,按钮背景色,提示的消息的字体颜色都可以改变 利用单例实现丰富的自定义接口 / ...

最新文章

  1. mockito_使用FizzBu​​zz和Mockito进行单元测试
  2. python图形用户界面设计报告_19.1 Python图形用户界面开发工具包
  3. FIR仿真module_04
  4. WPF 菜单栏滚动到顶部后固定的两种方法
  5. 深度 | 数据仓库分层存储技术揭秘
  6. 如何根据进程号去查端口号?
  7. Normal Equation----machine learning
  8. visio软件接口流程图_绘制流程图——Visio可以让你事半功倍哦!
  9. android 屏幕尺寸适配实现方案
  10. 程序员年后离职跳槽指南
  11. 用python编写猜拳游戏
  12. 魔与道java版本_魔与道360版下载
  13. imx6 android 最新,Re: IMX6D Android6.0 OTA 升级问题
  14. SpringCloud简介---01
  15. 第五章.系统安全分析与设计
  16. SpringBoot+vue+jpa+mysql前后台分离实现增删改查分页和三级联动(附源码)(一)
  17. 尼泊尔宣布将重测珠穆朗玛峰高度
  18. 链路捆绑与端口聚合原理与实验结合理解小白看了都秒懂(华为ensp模拟器)不懂不可能的
  19. 转 | 禁忌搜索算法(Tabu Search)求解带时间窗的车辆路径规划问题详解(附Java代码)
  20. 日语基础复习 Day 14

热门文章

  1. kafka报错:Connection with localhost/127.0.0.1 disconnected java.net.ConnectException: Connection refus
  2. 成都榆熙:电商流量效果如何检验?
  3. 2022施工员-设备方向-通用基础(施工员)操作证考试题及模拟考试
  4. TS型网页视频下载方法
  5. 缺这项能力,做不了技术管理工作
  6. java oop_java面试提问:什么是OOP?
  7. 一分钟了解阿里云产品:补丁管理
  8. 详解JS中的Object
  9. 软件项目需求分析困难的原因
  10. python深圳培训机构哪里好