MobDevGroupiOS开发(OC)Ios开发学习

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

2017-01-19  本文已影响2330人  胡萝卜须摇头玩

首先看一下微信的聊天界面:

微信聊天界面.png

可以看到,并非每一条消息都显示发送时间,其显示具有一定的规则。
</br>

微信聊天时间显示规则:

实现方法:

(聊天界面可以利用UITableView来实现,其中的每一条消息都可以看作一个个的UITableViewCell,只不过每个Cell需要自定义,具体实现方法这里就不多说了。)

简单起见,假定每条消息有以下几个属性:

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的时间
上一篇 下一篇

猜你喜欢

热点阅读