前语

iOS OC语言原生开发的IM模块,用于项目中需求原生开发IM的情况,具有发送文字、表情、语音、图片、视频等完好的UI能力,因为之前完成的时候后端api不对外,所在这一块自己没有做完成。包含图片预览视频播放等功用,此项目将会长时间更新如有问题能够提出,我的邮箱:fshmjl@aliyun.com,我将赶快处理

仓库地址:github.com/fshmjl/RCha…

效果图如下

iOS 实现原生IM开发

项目介绍

项目中对输入框等模块功用进行了封装,便利复用或重写

输入框模块              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哟。