环信进阶篇-实现名片|红包|话题聊天室等自定义cell

    伴随着即时通讯成为了越来越多APP的刚需,匿名社交、阅后即焚、红包等新玩法层出不穷,基本的聊天方式越来越难以满足变态的需求。环信提供的自定义扩展属性功能非常的强大,能够帮助我们在cell中的各种需求做定制处理。这是分享一个之前做过的方法及实现,大家可以借鉴处理的过程及思路,如有不妥之处,请大家及时留言告知,谢谢。 
今天就给大家介绍下怎么对cell中的各种需求的定制处理


 类型一:在现有会话cell上修改UI效果

类似于上面给出的截图,我们有时候需要对环信官方给出的cell进行些许的调整。例如:项目中加入了不同于普通群聊或者聊天室的功能需求
点击话题聊天,大家加入聊天室,这里发出的各种就是不同于普通聊天,普通的聊天只需展示文字、地址、图片等等,但是这里的需求是得加上时间、私聊按钮,没砍需求之前是还有点赞和取消赞的按钮。
我们在普通聊天的基础上新建几个cell,文字、语音、图片、地图等等,不能和原有的普通cell混合起来,因为需求有普通聊天。

直接把普通聊天cell中的代码拷贝过来,再在此基础上进行cell的UI自定义处理,就拿文字聊天时的处理情况为例:


1、拷贝复制原有普通聊天cell内的代码

2、把需要的新增的UI控件初始化

3、适配各类控件

4、传值及赋值

5、新增按钮点击和本身cell的点击效果处理(别和cell上的点击效果混到一起)

6、耐心调整cell上UI效果

以上基本就是简单的自定义cell步骤了,有基础的小伙伴看下步骤应该就有思路了


类型二:类似于红包和名片Cell的UI效果


通常在我们项目中,并不只有文字、图片等等这些简单的聊天内容,有时候我们需要把自己的信息作为一张名片发给对方、发个红包给好朋友、发一个项目中的一个模块介绍给对方等等功能要求。
我们就拿雷哥的这张假名片为例:
/*!
@method
@brief 新增一个新的功能按钮
@discussion
@param image 按钮图片
@param highLightedImage 高亮图片
@param title 按钮标题
@result
*/
- (void)insertItemWithImage:(UIImage*)image
highlightedImage:(UIImage*)highLightedImage
title:(NSString*)title;
/*!
@method
@brief 修改功能按钮图片
@discussion
@param image 按钮图片
@param highLightedImage 高亮图片
@param title 按钮标题
@param index 按钮索引
@result
*/
- (void)updateItemWithImage:(UIImage*)image
highlightedImage:(UIImage*)highLightedImage
title:(NSString*)title
atIndex:(NSInteger)index;
/*!
@method
@brief 根据索引删除功能按钮
@discussion
@param index 按钮索引
@result
*/
- (void)removeItematIndex:(NSInteger)index;
*  消息体类型
typedef enum{
EMMessageBodyTypeText  = 1,    /*! \~chinese 文本类型 \~english Text */
EMMessageBodyTypeImage,        /*! \~chinese 图片类型 \~english Image */
EMMessageBodyTypeVideo,        /*! \~chinese 视频类型 \~english Video */
EMMessageBodyTypeLocation,      /*! \~chinese 位置类型 \~english Location */
EMMessageBodyTypeVoice,        /*! \~chinese 语音类型 \~english Voice */
EMMessageBodyTypeFile,          /*! \~chinese 文件类型 \~english File */
EMMessageBodyTypeCmd,          /*! \~chinese 命令类型 \~english Command */
}EMMessageBodyType;
如果环信把这个开放出来,或许我们就更加简单了我们只需自己修改成自己对应的类型即可。但是这个目前就想想,所以我们可以在以上类型中找一个出来,在它的基础上做些文章,变成我们想要的类型。

红包和名片最像什么。。。。对,不就和图片差不多嘛,不过小伙伴也不要以为只能拿图片来做文章,其他的我们都可以拿来用,这里就拿文字类型来作为例子(原理都一样)。
01.jpg

名片类型
这里我们只简要介绍怎么根据会话类型来显示名片,具体传值等怎么做,有基础的小伙伴应该都懂,不懂的小伙伴见文章底部。
 
  1. 我们需要在发送名片时,在拓展消息里面存一个名片的字段,这个字段可以被用来判断是名片、红包等等。
  2. 名片、红包等等中内容,同样也存在拓展属性中(这里不做过多介绍)
  3. 我们在展示自己的消息和接收到对方的消息时,在文字类型的基础上再进一步判断是什么类型,加载对应类型的视图,如果是红包就加载红包的view,如果是名片就展示名片view......


02.jpg

加载不同类型的cell
好了,以上就是我们所要介绍的两种不同类型cell的处理办法。


以下是补充自定义cell时遇到的各种情况及处理:
1、cell上语音、图片等原始点击和新增按钮点击冲突处理:

注释掉原有的点击方法,把原有的点击方法放到具体的控件上去,避免cell上多个控件点击的冲突

重点:记得把气泡上的点击权限打开
_backgroundImageView.userInteractionEnabled = YES;


03.jpg

解决点击冲突
2、cell上语音气泡长度的改变,避免过段影响布局

我们只需把原有语音上的语音长度Label距语音图片控件调大一点距离就能自动把语音类气泡拉长。(其他类型一样处理原理)
04.jpg

语音气泡拉长
3、因新增控件导致在原有cell上高度的变化处理
/*! @method @brief 根据消息的内容,获取当前cell的高度 @discussion @param model        消息对象model @result 返回cell高度 */
+ (CGFloat)cellHeightWithModel:(id)model
在原cell高度处理的情况下,根据各种类型的判断进行cell高度的自适应。
05.jpg

cell高度处理
4、文字类型气泡长度的处理

我暂时的处理方法:判断输入的文字长度,加入文字长度小于10,我会在后面自动补全5个空格,被动撑长气泡的长度。

假如小伙伴们有更好的建议也可以留言,谢谢!

2 个评论

怎么我写完 很多都没了 如果有问题的可以前往我的简书地址:http://www.jianshu.com/p/8befabfdc4f0
写的很棒,环信稿酬计划,你值得拥有!http://www.imgeek.org/article/825308713

要回复文章请先登录注册

知识价值的认可,源自您的赞赏

扫描二维码,你的支付将由imGeek代收后转给对方

×