iOS OC语言原生开发的IM模块--RChat
iOS OC语言原生开发的IM模块,用于项目中需要原生开发IM的情况,具备发送文字、表情、语音、图片、视频等完整功能,包含图片预览视频播放等功能,此项目将会长期更新如有问题可以提出,我的邮箱:fshmjl@aliyun.com,我将尽快解决; 项目地址:https://github.com/fshmjl/RChat
效果图如下

项目介绍
项目中对输入框等模块功能进行了封装,方便复用或重写
输入框模块 InputBox
输入框功能页面 KInputBoxView.m
输入框表情页面 KInputBoxViewCtrl.m
输入框更多页面 KInputBoxMoreView.m
输入框部分代理 KInputBoxViewDelegate
KInputBoxViewDelegate提供的代理
@protocol KInputBoxViewDelegate <NSObject> @optional
#pragma mark - 表情页面(KInputBoxEmojiView)代理 /**
点击选择表情 @param emojiView 表情所在页面
@param emojiDic 表情数据
@param emojiType 表情类型
*/
- (void)emojiView:(KInputBoxEmojiView *)emojiView
didSelectEmoji:(KEmojiModel *)emojiDic
emojiType:(KEmojiType)emojiType; /**
删除光标前面的表情
*/
- (void)emojiViewDeleteEmoji; /**
点击发送按钮,发送表情 @param emojiView 表情菜单
@param emojiStr 发送按钮
*/
- (void)emojiView:(KInputBoxEmojiView *)emojiView
sendEmoji:(NSString *)emojiStr; #pragma mark - 表情菜单代理部分 /**
点击添加表情按钮 @param menuView 表情菜单
@param addBut 点击按钮
*/
- (void)emojiMenuView:(KInputBoxEmojiMenuView *)menuView
clickAddAction:(UIButton *)addBut; /**
选择表情组 @param menuView 表情菜单页面
@param emojiGroup 表情组
*/
- (void)emojiMenuView:(KInputBoxEmojiMenuView *)menuView
didSelectEmojiGroup:(KEmojiGroup *)emojiGroup; /**
点击发送按钮,发送表情 @param menuView 表情菜单
@param sendBut 发送按钮
*/
- (void)emojiMenuView:(KInputBoxEmojiMenuView *)menuView
sendEmoji:(UIButton *)sendBut; #pragma mark - 输入框代理部分 /**
通过输入的文字的变化,改变输入框的高度 @param inputBox 输入框
@param height 改变的高度
*/
- (void)inputBox:(KInputBoxView *)inputBox changeInputBoxHeight:(CGFloat)height; /**
发送消息 @param inputBox 输入框
@param textMessage 输入的文字内容
*/
- (void)inputBox:(KInputBoxView *)inputBox
sendTextMessage:(NSString *)textMessage; /**
状态改变 @param inputBox 输入框
@param fromStatus 上一个状态
@param toStatus 当前状态
*/
- (void)inputBox:(KInputBoxView *)inputBox
changeStatusForm:(KInputBoxStatus)fromStatus
to:(KInputBoxStatus)toStatus; /**
点击输入框更多按钮事件 @param inputBox 输入框
@param inputStatus 当前状态
*/
- (void)inputBox:(KInputBoxView *)inputBox
clickMoreInput:(KInputBoxStatus)inputStatus;
会话页面
会话页面其实不用多说的,就是一个普通的UITableView,如果需要重写会话视图,只需要对其Cell(KMessagesListTableViewCell)进行改动即可
重点介绍聊天页面
众所周知聊天页面也是一个UITableView,其实聊天页面真正繁琐的是不同消息类型的不同Cell问题,还有就是在消息页面中布局的问题,由于消息页面出现不同的Cell较多,而且刷新频繁,所有要考虑很多UITableView优化的问题,如布局问题,AutoLayout虽然在布局方面有优势,但是会使性能下降,所以在RChat中消息页面及Cell中几乎都是使用的Frame布局,主要是为了提升性能。另一个问题就是计算行高的问题,对于UITableView优化已经是一个老生常谈的问题,我们Cell是需要先设置行高的,所以一般都需要对行高进行缓存,避免系统多次计算。 在写这个项目的时候我也看过好几篇IM界面的项目或者说demo,都不是很完整,几乎是不能直接使用的,所以写了这个项目,项目很多东西都是可以重写,继承和扩展。聊天消息支持的类型有文字(包含表情)、图片、视频、语音和邮件,其他类型需要根据需要自己定义,但是定义的时候建议继承KChatTableViewCell,方便统一处理。
消息基类 KChatTableViewCell
文本消息(包含表情) KChatTextTableViewCell
图片消息 KChatImageTableViewCell
视频消息 KChatVideoTableViewCell
语音消息 KChatVoiceTableViewCell
邮件消息 KChatMailTableViewCell
消息代理 KChatTableViewCellDelegate
KChatTableViewCellDelegate中提供的方法
@protocol KChatTableViewCellDelegate <NSObject> /**
点击cell中的头像 @param tableViewCell 当前cell
@param messageModel 当前cell的数据
*/
- (void)chatTableViewCell:(KChatTableViewCell *)tableViewCell clickAvatarImageViewMessageModel:(KMessageModel *)messageModel; /**
点击消息背景 @param tableViewCell 当前cell
@param messageModel 当前cell的数据
*/
- (void)chatTableViewCell:(KChatTableViewCell *)tableViewCell clickBackgroudImageViewMessageModel:(KMessageModel *)messageModel; /**
当发送失败时点击,发送状态展示视图 @param tableViewCell 当前cell
@param conversationModel 会话信息
@param messageModel 消息
*/
- (void)chatTableViewCell:(KChatTableViewCell *)tableViewCell clickResendMessageWithConversationModel:(KConversationModel *)conversationModel messageModel:(KMessageModel *)messageModel; /**
点击回复邮件 @param tableViewCell 当前cell
@param messageModel 当前cell的数据
*/
- (void)chatTableViewCell:(KChatMailTableViewCell *)tableViewCell replyMailMessageModel:(KMessageModel *)messageModel; /**
点击回复全部 @param tableViewCell 当前cell
@param messageModel 当前cell的数据
*/
- (void)chatTableViewCell:(KChatMailTableViewCell *)tableViewCell
replyAllMaillMessageModel:(KMessageModel *)messageModel; /**
点击转发邮件 @param tableViewCell 当前cell
@param messageModel 当前cell的数据
*/
- (void)chatTableViewCell:(KChatMailTableViewCell *)tableViewCell
transmitMailMessageModel:(KMessageModel *)messageModel; /**
点击语音消息 @param tableViewCell 当前cell
@param messageModel 当前数据
*/
- (void)chatTableViewCell:(KChatVoiceTableViewCell *)tableViewCell clickVoiceMessageMessageModel:(KMessageModel *)messageModel;
聊天消息控制器 KChatViewController 控制器使用Category的方式分类开发
页面定义和文本消息 KChatViewController
语音部分 KChatViewController+Voice
图片和视频部分 KChatViewController+Image
消息页面提供几个经常使用的方法
// 重新刷新数据
- (void)reloadData;
// 移动到底部
- (void)scrollTableViewBottom ;
// 添加一条消息
- (void)addMessage:(KMessageModel *)model;
// 最后一条消息
- (KMessageModel *)lastMessage;
发送一条消息是,需要构造一个KMessageModel,调用addMessage:就可以,但是需要做缓存和上传到服务端的代码需要根据自己的需求写。
在项目中有什么疑问的,或者存在bug的,都可以给我提Issues,描述清楚问题和重现步骤,我将第一时间更新,如果有需要帮忙的同学可以发邮件到fshmjl@aliyun.com,最后麻烦大家点个Star哟。
项目地址:https://github.com/fshmjl/RChat或https://gitee.com/rpkDev/RChat
iOS OC语言原生开发的IM模块--RChat的更多相关文章
- iOS - OC 语言新特性
前言 相对于 Java,OC 语言是一门古老的语言了,而它又是一门不断发展完善的语言.一些新的编译特性,为 OC 语言带来了许多新的活力.在 Xcode7 中,iOS9 的 SDK 已经全面兼容了 O ...
- iOS多语言(国际化)开发(尾随系统 + APP内手动设置)
一:尾随系统切换语言 1>创建好项目project后, 新建一个多语言文件: 2>加入要设置的语言类型: 3>加入成功 细心的朋友可能会发如今English后面写的是3 Files ...
- iOS OC语言: Block底层实现原理
先来简单介绍一下BlockBlock是什么?苹果推荐的类型,效率高,在运行中保存代码.用来封装和保存代码,有点像函数,Block可以在任何时候执行. Block和函数的相似性:(1)可以保存代码(2) ...
- iOS OC语言: Block底层实现原理 (转载)
作者:Liwjing 地址:http://www.jianshu.com/users/8df89a9d8380/latest_articles 先来简单介绍一下Block Block是什么? 苹果推荐 ...
- iOS开发-OC语言 (一)oc数据类型
分享一套以前学习iOS开发时学习整理的资料,后面整套持续更新: oc数据类型 数据类型:基本数据类型.指针数据类型 基本数据类型:数值型.字符型(char).布尔型.空类型(void) 指针数据类型: ...
- 李洪强iOS开发之OC语言前期准备
OC语言前期准备 一.OC简介 Oc语言在c语言的基础上,增加了一层最小的面向对象语法,完全兼容C语言,在OC代码中,可以混用c,甚至是c++代码. 可以使用OC开发mac osx平台和ios平台的应 ...
- 李洪强iOS开发之OC语言类的深入和分类
OC语言类的深入和分类 一.分类 (一)分类的基本知识 概念:Category 分类是OC特有的语言,依赖于类. 分类的作用:在不改变原来的类内容的基础上,为类增加一些方法. 添加一个分类: 文件 ...
- ios学习笔记图片+图片解释(c语言 oc语言 ios控件 ios小项目 ios小功能 swift都有而且笔记完整喔)
下面是目录其中ios文件夹包括了大部分ios控件的介绍和演示,swift的时完整版,可以学习完swift(这个看的是swift刚出来一周的视频截图,可能有点赶,但是完整),c语言和oc语言的也可以完整 ...
- 李洪强iOS开发之OC语言基础知识
OC语言基础知识 一.面向对象 OC语言是面向对象的,c语言是面向过程的,面向对象和面向过程只是解决问题的两种思考方式,面向过程关注的是解决问题涉及的步骤,面向对象关注的是设计能够实现解决问题所需功能 ...
随机推荐
- 20155317 王新玮 2006-2007-2 《Java程序设计》第4周学习总结
20155317 王新玮 2006-2007-2 <Java程序设计>第4周学习总结 教材学习内容总结 第六章 继承共同行为 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那 ...
- spring_cloud多个微服务访问时偶发forward_error问题
1.问题: 最近在做SpringBoot项目的时候,有多个分开的微服务,偶发forward error 问题 2.猜想: 个人理解为服务跳转错误,可能本身没找到目标服务,或者目标服务损坏 3.解决: ...
- [bzoj1564]二叉查找树
题目描述 已知一棵特殊的二叉查找树.根据定义,该二叉查找树中每个结点的数据值都比它左儿子结点的数据值大,而比它右儿子结点的数据值小. 另一方面,这棵查找树中每个结点都有一个权值,每个结点的权值都比它的 ...
- 强化学习读书笔记 - 11 - off-policy的近似方法
强化学习读书笔记 - 11 - off-policy的近似方法 学习笔记: Reinforcement Learning: An Introduction, Richard S. Sutton and ...
- TW实习日记:第六天
今日的一整天都是在开发微信相关的接口,因为项目的系统是嵌在企业微信中,所以不可避免的要产生微信UserID和企业系统ID的匹配关系,那么就需要用手机号或是邮箱这种两边都存在的唯一参数进行匹配.然后再将 ...
- ConcurrentHashMap(JDK1.8)为什么要放弃Segment
今天看到一篇博客:jdk1.8的HashMap和ConcurrentHashMap,我想起了前段时间面试的一个问题:ConcurrentHashMap(JDK1.8)为什么要使用synchronize ...
- springboot集成jpa,在postgresql数据库中创建主键自增表
依赖文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http:/ ...
- eos对数据库的操作
eosio的multi_index 概述 multi_index是eosio上的数据库管理接口,通过eosio::multi_index智能合约能够写入.读取和修改eosio数据库的数据 multi_ ...
- 如何选择合适的Qt5版本?
注意:这里讨论的是在不编译Qt源码的情况下,推荐下载的官方编译版本. 支持XP SP3以及之后的Windows版本:推荐 Qt5.6 或 Qt5.9,这两个版本是LTS版本(即长期支持版本),Bug较 ...
- 如何理解IPD+CMMI+Scrum一体化研发管理解决方案之Scrum篇
如何快速响应市场的变化,如何推出更有竞争力的产品,如何在竞争中脱颖而出,是国内研发企业普遍面临的核心问题,为了解决这些问题,越来越多的企业开始重视创新与研发管理,加强研发过程的规范化,集成产品开发(I ...