一些优化:

禁止TableView的点击:

self.tableView.allowsSelection = NO;

合并相同的时间:

不需要显示的时间,只要不设置尺寸就行了。

一个if判断的技巧,为了防止把==写成赋值,可以让左边的为非左值:

NO == message.hideTime

对于时间的判断,应该放在所有模型加载的地方(懒加载的位置)。

为了得到上一条消息,由于使用的是for-in语句,无法获得index,但是由于临时数组在循环的最后才加入这一次循环操作的模型,因此在下一次循环开始时,临时数组中的lastObject存的正是上一次的消息模型,只需要判断二者的字符串是否全等即可,不必判断是否上一条消息为nil,因为nil的所有操作都会得到nil。

- (NSMutableArray *)messageFrames{

    if (_messageFrames == nil) {

        NSString *path = [[NSBundle mainBundle] pathForResource:@"messages.plist" ofType:nil];
NSArray *dictArray = [NSArray arrayWithContentsOfFile:path];
NSMutableArray *mfArray = [NSMutableArray array];
for (NSDictionary *dict in dictArray) {
Message *msg = [Message messageWithDict:dict]; //取出上一个模型:利用mfArray的LastObject
MessageFrame *lastMf = [mfArray lastObject];
Message *lastMsg = lastMf.message; msg.hideTime = [msg.time isEqualToString:lastMsg.time]; MessageFrame *mf = [[MessageFrame alloc] init]; mf.message = msg; [mfArray addObject:mf];
}
_messageFrames = mfArray;
} return _messageFrames; }

接下来需要解决的就是聊天气泡的Button了,由于Button需要多次改变,在自定义Cell内里面进行调整。

聊天气泡的图片大小是有限的,为了能大幅度拉伸图片又不影响图片质量,可以进行局部像素复制拉伸;也可以把气泡按钮加大,把label缩小(设置内边距)。

聊天气泡是通过一个按钮和设置按钮的titleLabel实现的,如果只改变titleLabel的内边距,会使得图片上下超出按钮的边界,如下图所示:

为了让按钮的title居中后压缩不会超出按钮边界,设内边距的值为x,那么先把按钮的宽高都增加2x,这样当标题居中后,四周都留下了x的“防线”,这样再压缩标题就不会超出边界了。

但是按钮过大会使得图片失真和变形严重,应该采用另一种做法,复制图片的中间像素。

代码的实现:

在iOS5以前,使用的方法是告诉左边和上边,拉伸的是左边向下一个,上边向下一个的像素。

在iOS5和以后,有一个新的方法可以提供这四条线来拉伸(安全起见是锁定最中间的像素),例如图片大小是64x56个点(注意用点表示),应该左右各31,上下各27。

在iOS6和以后,可以设定平铺(tile)还是拉伸(stretch)。

最应该注意的是,这个方法返回的是一个新的图片,必须重新赋值再试用。

UIImage *normal = [UIImage imageNamed:@"chat_send_nor"];
UIImage *lastNoraml = [normal resizableImageWithCapInsets:UIEdgeInsetsMake(27, 31, 27, 31)];
[self.textView setBackgroundImage:lastNoraml forState:UIControlStateNormal];

注意按钮的文字颜色不能使用titleLabel.textColor,因为是分状态的,应该有setTitleColor方法。

[self.textView setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];

(二十一)即时通信的聊天气泡的实现II的更多相关文章

  1. (二十)即时通信的聊天气泡的实现I

    Tip:通过xib和storyboard不可能将一个控件作为ImageView的子控件,只能通过代码的addSubview方法实现. 设置图片的细节:如果button比图片大(为了方便对齐),将图片设 ...

  2. (二十一)c#Winform自定义控件-气泡提示

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...

  3. iOS开发之使用XMPPFramework实现即时通信(二)

    上篇的博客iOS开发之使用XMPPFramework实现即时通信(一)只是本篇的引子,本篇博客就给之前的微信加上即时通讯的功能,主要是对XMPPFramework的使用.本篇博客中用到了Spark做测 ...

  4. (转)基于即时通信和LBS技术的位置感知服务(二):XMPP协议总结以及开源解决方案

    在<基于即时通信和LBS技术的位置感知服务(一):提出问题及解决方案>一文中,提到尝试使用XMPP协议来实现即时通信.本文将对XMPP协议框架以及相关的C/S架构进行介绍,协议的底层实现不 ...

  5. 基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍。最后我们将会实现一个基于Server-Sent Event和Flask简单的在线聊天室。

    基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍.最后我们将会实现一个基于S ...

  6. QQ 腾讯QQ(简称“QQ”)是腾讯公司开发的一款基于Internet的即时通信(IM)软件

    QQ 编辑 腾讯QQ(简称“QQ”)是腾讯公司开发的一款基于Internet的即时通信(IM)软件.腾讯QQ支持在线聊天.视频通话.点对点断点续传文件.共享文件.网络硬盘.自定义面板.QQ邮箱等多种功 ...

  7. 基于XMPP协议的Android即时通信系

    以前做过一个基于XMPP协议的聊天社交软件,总结了一下.发出来. 设计基于开源的XMPP即时通信协议,采用C/S体系结构,通过GPRS无线网络用TCP协议连接到服务器,以架设开源的Openfn'e服务 ...

  8. 【原】iOS学习43即时通信之XMPP(2)

    本篇是 即时通信之XMPP(2) 接上次 即时通信之XMPP(1) 1. 好友列表 1> 初始化好友花名册 // 获取管理好友的单例对象 XMPPRosterCoreDataStorage *r ...

  9. (转)基于即时通信和LBS技术的位置感知服务(三):搭建Openfire服务器+测试2款IM客户端

    主要包含4个章节: 1. Java 领域的即时通信的解决方案 2. 搭建 Openfire 服务器 3. 使用客户端测试我们搭建的 Openfire 服务器 4. Smack 和 ASmack 一.J ...

随机推荐

  1. Webpack 2 设置为从当前文件夹逐级向上查找模块

    比较实用, 当你在cd到子文件夹运行webpack时,你可能想要require文件夹js里面的一些模块, 但你又想将祖先的js文件夹作为fallback.这样设置即可: module.exports ...

  2. CNN在中文文本分类的应用

    深度学习近一段时间以来在图像处理和NLP任务上都取得了不俗的成绩.通常,图像处理的任务是借助CNN来完成的,其特有的卷积.池化结构能够提取图像中各种不同程度的纹理.结构,并最终结合全连接网络实现信息的 ...

  3. Hibernate之SchemaExport的使用

    @Test public void testCreateDB(){ Configuration cfg = new Configuration().configure(); SchemaExport ...

  4. iOS开源加密相册Agony的实现(四)

    简介 虽然目前市面上有一些不错的加密相册App,但不是内置广告,就是对上传的张数有所限制.本文介绍了一个加密相册的制作过程,该加密相册将包括多密码(输入不同的密码即可访问不同的空间,可掩人耳目).Wi ...

  5. Shell脚本了解

    一.什么是Shell Shell 是一个用C语言编写的程序,它是用户使用Linux的桥梁.Shell既是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序,这个应用程序提供了一个界面, ...

  6. 20160224.CCPP体系详解(0034天)

    程序片段(01):指针与结构体.c 内容概要:指针与结构体 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include < ...

  7. Twitter 架构优化之路--Twitter是如何做到每秒处理3000张图片的

    如今,Twitter每秒可以创建并保存3000张(20GB)的图片.2015年,Twitter甚至从对媒体存储策略的优化中节省出了600万美元. 但并非一开始就是这样的,2012年Twitter还主要 ...

  8. PGM:部分有向模型之条件随机场与链图模型

    http://blog.csdn.net/pipisorry/article/details/52529287 贝叶斯网与马尔可夫网 [PGM:无向图模型:马尔可夫网]中例3.8和例4.8显示,贝叶斯 ...

  9. ThinkPHP 初探

    准备 ThinkPHP下载 Eclipse-for-php 如何使用 放置位置 检验引用效果 效果 路由 调试之模板的使用 前提 生产模式 开发模式 添加完相应的路径以及模板文件后 总结 对国人开发的 ...

  10. UISearchController替换UISearchDisplayController

    随着iOS 的升级,iOS 7的占有率更低了.Xcode 升级到Xcode 8之后,对iOS 应用支持的最低版本,iOS 7也被抛弃了.我在新项目中也是最低支持到iOS 8,因此工程里也是各种警告.首 ...