iOS 微信聊天时间显示规则实现方法
2017-01-19 本文已影响2330人
胡萝卜须摇头玩
首先看一下微信的聊天界面:
微信聊天界面.png可以看到,并非每一条消息都显示发送时间,其显示具有一定的规则。
</br>
微信聊天时间显示规则:
- 当天的消息,以每5分钟为一个跨度显示时间;
- 消息超过1天、小于1周,显示为“星期 消息发送时间”;
- 消息大于1周,显示为“日期 消息发送时间”。
实现方法:
(聊天界面可以利用UITableView来实现,其中的每一条消息都可以看作一个个的UITableViewCell,只不过每个Cell需要自定义,具体实现方法这里就不多说了。)
简单起见,假定每条消息有以下几个属性:
- sendUserId 发送者
- receiveUserId 接受者
- content 消息内容
- time 发送时间
- isTimeVisible 是否显示时间
1、将UITableView数据源中的数据按时间先后顺序排序
//按字段将数组进行升序或降序排列
-(NSArray *)sortResult:(NSArray *)resultArr byField:(NSString *)field isAscending:(BOOL)isAscending{
if(resultArr==nil||resultArr.count<=0){
return nil;
}
NSSortDescriptor *fieldWithSort=[[NSSortDescriptor alloc]initWithKey:field ascending:isAscending];
NSArray *tempArray=[NSArray arrayWithObjects:fieldWithSort, nil];
NSArray *sortedArray=[resultArr sortedArrayUsingDescriptors:tempArray];
return sortedArray;
}
2、计算每条消息与上一条显示时间的消息的间隔时间
定义变量lastVisibleTime为排序后的数据源中的第一条消息的时间(第一条消息一定显示时间),依次计算后面每条消息与lastVisibleTime的间隔时间,如果大于等于5分钟,则标记该条消息的“isTimeVisible”属性值为true,并将其发送时间赋值给lastVisibleTime,以此类推。
//计算每条消息是否显示时间
//dataArray:UITableView的数据源
-(void)computeVisibleTime:(NSMutableArray *dataArray){
Message *msg;
NSString *lastVisibleTime=[NSString string];
for (int i=0; i<dataArray.count; i++) {
msg=[dataArray objectAtIndex:i];
if (i==0)
{
msg.isTimeVisible=true;
lastVisibleTime=msg.time;
}
else
{
int timeSpan=(int)[self compareDate1:[self getDateFromString:lastShowMsgTime] withDate2:[self getDateFromString:msg.time] type:2];
if (timeSpan>=5)
{
msg.isTimeVisible=true;
lastVisibleTime=msg.time;
}
}
dataArray[i]=msg;
}
}
/**
* 计算两日期之间时间之差
* date1<date2
*/
-(long) compareDate1:(NSDate *)date1 withDate2:(NSDate *)date2 type:(int)type
{
NSTimeInterval timeInterval = [date1 timeIntervalSinceDate:date2];
timeInterval = -timeInterval;
long result;
switch (type) {
case 1:
result = (long)timeInterval; //秒
break;
case 2:
result = (long)timeInterval/60; //分
break;
case 3:
result = (long)timeInterval/60/60; //时
break;
case 4:
result = (long)timeInterval/60/60/24; //天
break;
case 5:
result = (long)timeInterval/60/60/24/30; //月
break;
case 6:
result = (long)timeInterval/60/60/24/365; //年
break;
default:
break;
}
return result;
}
//字符串转日期
-(NSDate *)getDateFromString:(NSString *)string
{
if ([string rangeOfString:@"."].length>0) {
string=[string substringToIndex:[string rangeOfString:@"."].location];
}
NSDateFormatter* dateFormat = [[NSDateFormatter alloc] init];//实例化一个NSDateFormatter对象
if ([string rangeOfString:@" "].length>0) {
[dateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss"];//设定时间格式,这里可以设置成自己需要的格式
}else{
[dateFormat setDateFormat:@"yyyy-MM-dd"];//设定时间格式,这里可以设置成自己需要的格式
}
if ([string rangeOfString:@"."].length>0) {
string=[string substringToIndex:[string rangeOfString:@"."].location];
}
NSDate *date =[dateFormat dateFromString:string];
return date;
}