美文网首页MobDevGroupiOS开发(OC)Ios开发学习
iOS 微信聊天时间显示规则实现方法

iOS 微信聊天时间显示规则实现方法

作者: 胡萝卜须摇头玩 | 来源:发表于2017-01-19 10:45 被阅读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;
}
3、重新加载UITableView,按每条消息的isTimeVisible属性值来显示或者隐藏UITableViewCell的时间

相关文章

网友评论

  • b1eacb30758d:楼主你好,我还有一个时问题想问一下你,这种时间格式“2017-05-15T03:58:43.444Z”转成本地时间你处理过吗?
    b1eacb30758d:@胡萝卜须摇头玩 好的,还是谢谢楼主,但是我还是实现了转成本地时间
    胡萝卜须摇头玩:@媛小白 没有额,不好意思
  • Frey丶:不错.刚好做到这部分.自己思路和清晰.mark一下
    Frey丶:@胡萝卜须摇头玩 不是哈.看了你的文章思路很清晰了.哈哈抱歉...我的锅..
    流星留步:@胡萝卜须摇头玩 我猜原话是:作者思路很清晰,夸你呢
    胡萝卜须摇头玩:@Frey丶 :disappointed_relieved:自己思路和清晰是什么鬼?

本文标题:iOS 微信聊天时间显示规则实现方法

本文链接:https://www.haomeiwen.com/subject/symbbttx.html