这近正在做一个项目,我是负责里面的聊天模块,聊天分为单聊和群聊;开始做的时候时候采用的XMPP,虽然之前都没接触过,但一直都想有这么一个机会深入的了解下XMPP的通讯协议;

经过一个星期的各种GOOGLE,百度,查看XMPP协议文档(文档信息太大了,看的头疼),自己照着搭建了一个xmpp服务器,利用Adium模拟客户端通讯,简单的实现了

单聊,群聊;好友上线,下线,加人,同意加入,邀请群加入等。。。完成了2/1的功能。

服务器原因,后俩采用HTTP长连接进行聊天通讯。

长连接对于移动端来说简单多了,所有的工作都有服务器帮我们进行实现.

扯远了,改天吧我写的xmppDemo给补上,今天还是说这个qq聊天表情的实现实现吧;

这个表情聊天的实现思路: 客户端跟服务器定义通信时表情符号: 比如<sml>smile</sml> 代表(微笑)的表情,

客户端再聊天的过程中凡是遇到这个标签的信息就需要转换成微笑表情图片;<sml> 与</sml>是封装表情的特定的标签,凡是遇到这两个标签就需要提取其中的值。

比如有人发来聊天信息: 美女,你好<sml>smile</sml>  客户端应该展示的是:美女,你好 

怎么解析这样的标签,我的做法是这样的,一个聊天信息由 文字与表情构成,我们则把它放在一个数组中表示,

比如: 美女,你好 代表arr[0] 然后 <sml>smile</sml>代表 arr[1],  不断类似反复的解析,其实这里可以用递归实现,非常简单 ;

为了实现图文混排的效果,自己简单的对此进行的一个简单的封装,继承UITextView,复写

drawRect重画计算其中表情数据的解析和文字.结合UITableViewCell 进行表情数据的展示。

[java] view plaincopy
  1. //
  2. //  FaceTextView.h
  3. //  聊天表情TextView
  4. //
  5. //  Created by liaoyp on 13-7-5.
  6. //  Copyright (c) 2013年 CDEL. All rights reserved.
  7. //
  8. #import <UIKit/UIKit.h>
  9. #define KFacialSizeWidth 24
  10. #define KFacialSizeHeight 24
  11. // 可以换成自定义的表情解析符
  12. #define startTag @"[sml]"
  13. #define endTag  @"[/sml]"
  14. @interface FaceTextView : UITextView
  15. @end
[java] view plaincopy
  1. //
  2. //  FaceTextView.m
  3. //  qhChat
  4. //
  5. //  Created by liaoyp on 13-7-5.
  6. //  Copyright (c) 2013年 ZB. All rights reserved.
  7. //
  8. #import "FaceTextView.h"
  9. @implementation FaceTextView
  10. - (id)initWithFrame:(CGRect)frame
  11. {
  12. self = [super initWithFrame:frame];
  13. if (self) {
  14. // Initialization code
  15. }
  16. return self;
  17. }
  18. // Only override drawRect: if you perform custom drawing.
  19. // An empty implementation adversely affects performance during animation.
  20. - (void)drawRect:(CGRect)rect
  21. {
  22. // Drawing code
  23. NSString *text = [NSString stringWithFormat:@"%@",self.text];
  24. self.text =@"";
  25. NSLog(@"chatMessage: %@",text);
  26. if (text.length == 0) {
  27. return;
  28. }
  29. //解析数据信息
  30. NSMutableArray *data=[[NSMutableArray alloc] init];
  31. [self parseChatMessage:text :data]; // 解析表情数据
  32. UIFont *fon=self.font;
  33. CGFloat upX=0;
  34. if (data) {
  35. for (int i=0;i<[data count];i++) {
  36. NSString *str=[data objectAtIndex:i];
  37. if ([str hasPrefix: startTag ]&&[str hasSuffix: endTag ]) {
  38. NSString *imageName=[str substringWithRange:
  39. NSMakeRange(startTag.length, str.length-(startTag.length+endTag.length))];
  40. UIImage *img=[UIImage imageNamed:imageName];
  41. [img drawInRect:CGRectMake(upX, 0, KFacialSizeWidth, KFacialSizeHeight)];
  42. upX=KFacialSizeWidth+upX;
  43. }else {
  44. CGSize size=[str sizeWithFont:fon constrainedToSize:CGSizeMake(320, 40)];
  45. [str drawInRect:CGRectMake(upX, 0, size.width, self.bounds.size.height) withFont:fon];
  46. upX=upX+size.width;
  47. }
  48. }
  49. }
  50. [data release];
  51. }
  52. /**
  53. 聊天信息表情解析
  54. @param (NSString*)message 需要被数据源
  55. @param  (NSMutableArray*)array 解析完毕后的表情和字符数组
  56. @returns array
  57. @by liaoyp
  58. */
  59. -(void)parseChatMessage:(NSString*)message :(NSMutableArray*)array
  60. {
  61. NSRange sRange=[message rangeOfString:startTag];
  62. NSRange eRange=[message rangeOfString:endTag];
  63. if (sRange.length&&eRange.length) { //没有表情信息
  64. if (sRange.location>0) {//当前信中含有文字信息
  65. [array addObject:[message substringToIndex:sRange.location]];// 解析初文字信息
  66. }
  67. NSString *nextstr=[message substringWithRange:NSMakeRange(sRange.location, eRange.location+endTag.length-sRange.location)];
  68. //排除文字是“”的
  69. if (![nextstr isEqualToString:@""]) {
  70. [array addObject:nextstr];//添加表情信息
  71. NSString *str=[message substringFromIndex:eRange.location+endTag.length];//删除解析完毕
  72. [self parseChatMessage:str :array]; //递归进行表情解析
  73. }else {
  74. return;
  75. }
  76. }else {
  77. [array addObject:message];
  78. }
  79. }
  80. @end

简单的表情数据解析完毕,接着就是结合UITableView进行聊天信息的展现。

相信大家对UITableView非常熟悉了,自定义一个聊天Cell,这里就不在多说。

我这边自己写了一个关于的demo,本想上传Github,密码暂时找不回来,大家想要的话留个言;

IOS_QQ表情聊天相关推荐

  1. Android最完整的仿QQ表情聊天图文展示代码示例

    安卓最完整的表情聊天特效(大家可以看我上一篇文章websocket的整合,这是他的后续) 首先我们需要知道安卓输入的是EditText 显示的内容是TextView, 但是TextView里面又只能显 ...

  2. php聊天室发送表情,聊天室之表情发送

    表情图片渲染 将表情包放置在public/img路径下,遍历文件渲染到前端界面 function initEmoji() { //获取前端存放表情的div var emojiContainer = d ...

  3. vue websocket 聊天之发送表情

    万事开头难,第一次接触websocket客服聊天聊天得我,也遇到了许多坑,被折磨过来得我,今天总结下一部分功能(发送表情)我也是借鉴了别人得代码,然后简化后,功能也实现了. <!-- 聊天记录得 ...

  4. Python+Socket实现多人聊天室,功能:好友聊天、群聊、图片、表情、文件等

    一.项目简介 本项目主要基于python实现的多人聊天室,主要的功能如下: 登录注册 添加好友 与好友进行私聊 创建群聊 邀请/申请加入群聊 聊天发送图片 聊天发送表情 聊天发送文件 聊天记录保存在本 ...

  5. ios 表情符号 键盘_iOS 表情键盘+gif聊天图文混排,看我的就够了

    更新: 1.解决首次加载键盘卡顿的问题: 2.修改聊天布局方式,现在无需计算,更加丝滑. 前言: 之前做过[OC版本]和[swift版本]图文混排和表情键盘,说实在的很low,特别是键盘,整体只是实现 ...

  6. 程序员专用表情包_拿走不谢

    摘要: 作为一个程序员,聊天时怎么能没有专属表情包? 业余收集适合程序员必备的表情,聊天,吐槽必备之良品啊! 程序猿不想和你说话,并-        被吐槽写BUG时怎么办              ...

  7. 程序员专用表情包,拿走不谢!

    作为一个程序员,聊天时怎么能没有专属表情包? 业余收集适合程序员必备的表情,聊天,吐槽必备之良品啊! 程序猿不想和你说话,并- 被吐槽写BUG时怎么办              产品又来提需求 产品又 ...

  8. 基于C++实现视频聊天软件(一)

    初来乍到,接触到音视频领域,在这期间参考开源代码和项目代码,用C++做了一个类似QQ的视频聊天Demo,这里将其中开源的视频通讯技术分享给大家. 工具: vs2010,MFC制作界面,网络传输机制(S ...

  9. 什么样的产品都会被山寨,最近和陌生人聊天很流行!!!Omegle

    Omegle 突然之间开始火了,短短数天,它创造了几十万的访问量,并且数据还在上升.Omegle是 在2009年3月25日,由美国一个名叫Leif K-Brooks的小伙子开发的一款和陌生人聊天的We ...

最新文章

  1. [转]我们为什么需要工作流
  2. 1215 - Cannot add foreign key constraint
  3. mysql添加字符串日期时间_mysql学习笔记--- 字符串函数、日期时间函数
  4. 什么是RPA 现在都有哪些产品
  5. 通常所说的pc机是指微型计算机,2017年自考计算机应用基础精选习题及答案(1)
  6. ioc控制反转_深入理解依赖注入(DI)和控制反转(IOC)
  7. 更新尺寸调用什么方法_Java 多线程启动为什么调用 start() 方法而不是 run() 方法?...
  8. php 所有国家时区,php输出全球各个时区列表
  9. 用ruby编写标准计算器_WatirMaker再次用Ruby编写
  10. 计算二叉树叶子结点数
  11. ubuntu下各种软件下载
  12. ReactNative进阶(五十三):Keystore file ‘..android.keystore‘ not found for signing config ‘debug‘问题解决
  13. 跨时钟域脉冲信号处理——脉冲同步器
  14. echarts绘制地图
  15. 基于OpenSSL,实现C语言SM2的PKCS10的证书请求
  16. UE4_模型_Bound(边界)
  17. Android Studio第十课网络编程2(学习打卡Day15)
  18. vscode及typro快捷键
  19. ID卡拆解做成手机刷门禁(类似NFC功能)
  20. 懒人福音,分享4个实用的Python自动化脚本

热门文章

  1. 如何成为一名软件测试高手? 月薪3K到17K,我做了什么?
  2. 你真的需要文档管理软件吗?
  3. Jni 内存泄露(Failed adding to JNI pinned array ref table (1024 entries))
  4. UM232H模块说明
  5. 深蓝计算机应用的人工智能技术是,【单选题】\ 深蓝\刚刚诞生时与一般的专业国际象棋选手下棋经常会输,经过一段时间的下棋磨练,它可以战胜国际象棋的世界冠军,这主要归功于\深蓝\计算机应用的人工智...
  6. 【PTA题目解答】7-7 调查电视节目受欢迎程度
  7. group by 与 where, having以及顺序
  8. 一文教你弄懂Flink核心功能和原理
  9. 如何才能躲过考验,fastapi+jinjia2
  10. 知道这5个隐藏资源网站的人非常少,难怪总是找不到资源!