博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(二十一)即时通信的聊天气泡的实现II
阅读量:5140 次
发布时间:2019-06-13

本文共 2161 字,大约阅读时间需要 7 分钟。

一些优化:

禁止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];

转载于:https://www.cnblogs.com/aiwz/p/6154232.html

你可能感兴趣的文章
[转]vs2010编译金山代码
查看>>
数学图形之Boy surface
查看>>
处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“Manag
查看>>
3.浏览器检测
查看>>
01: socket模块
查看>>
Border-radius
查看>>
mysql触发器
查看>>
Redis学习笔记(1)Redis安装和启动
查看>>
淌淌淌
查看>>
BZOJ1002:[FJOI2007]轮状病毒
查看>>
SSD5_Recommended Exercise 4 分析
查看>>
django实现分页功能
查看>>
CSS伪类与CSS伪元素的区别
查看>>
如何:修改字符串内容
查看>>
Tomcat Server之启动---Bootstrap类
查看>>
经典问题-生产者和消费者问题
查看>>
Hadoop Distributed File System 简介
查看>>
文档通信(跨域-不跨域)、时时通信(websocket)、离线存储(applicationCache)、开启多线程(web worker)...
查看>>
常用正则表达式
查看>>
队列的基本使用方法
查看>>