iOS tableViewCell 在cell赋值、网络加载照片位置偏移大小错乱,做一个类似qq列表的tableview


    需求: 类似QQ列表的头像加载刷新,判断在线离线状态改变头像,以及彩色头像灰色处理,下载图片+获取在线状态需要连网--再改变头像
    问题:由于cell的复用以及下拉刷新数据每次加载10条数据,会出现头像赋值不正确,位置偏移大小不同的变化
    原因:由于cell的重复调用,加载数据方法已经赋值方法也在重复的调用,所以头像加载 在线状态判断好后,网络延迟,         (个人开始yy:启动时的cell和赋值结束的cell可能不是同一个)
    修改:当cell开始调用的时候,给当前的cell赋tag值,加载结束判断是不是自己的tag:不是了跳过是了赋值。反正可以解决问题

    避免头像的重复加载,更换:由于每次进来都要重新加载一组新的头像,并没有做本地化处理;
    处理:在控制器中添加一个可变的字典dict ; dict= {@"0":image,@"1":image,@"2":image,@"3":@"default",@"lasttime":@"0/1/2"}         0是离线的image;1在线;2忙碌;3有值(使用默认头像,不存入字典);lasttime 记录上一次的状态,刷新时首先显示上一次的状态值,刷新状态后:对比上一次,         如果和上一次不一样了在更换;

    不足之处多多指教。
//头像灰化处理
//置灰
+(UIImage*)createGrayCopy:(UIImage*)source{
    int width = source.size.width;
    int height = source.size.height;
    CGColorSpaceRef colorSpace =CGColorSpaceCreateDeviceGray();
    CGContextRef context =CGBitmapContextCreate(nil,
                                                width,
                                                height,
                                                8,// bits per component
                                                0,
                                                colorSpace,
                                                kCGBitmapByteOrderDefault);
    CGColorSpaceRelease(colorSpace);
    if(context ==NULL) {
        return nil;
    }
    CGContextDrawImage(context,
                       CGRectMake(0,0, width, height), source.CGImage);
    UIImage*grayImage = [UIImage imageWithCGImage:CGBitmapContextCreateImage(context)];
    CGContextRelease(context);
    return grayImage;
}


////////显示头像优先显示字典中的,字典为空显示 加载数据中,保存彩色、灰色到字典中 在viewdidload中初始化arrayAllImage大字典,以及默认图片

    NSMutableDictionary * dicc = arrayAllImage[model.uid];

    if (dicc.allKeys.count>0) {
        //之前保存过值

            if ([dicc[lasttime] isEqualToString:@"1"]) {

                    //在线
                if (dicc[@"3"]) {
                    //如果没有自己的头像
                    cell.imageview.image = imagehold;
                }else{

                cell.imageview.image = dicc[@"1"];
                }

               cell.busyOr.hidden = YES;

        }else if ([dicc[lasttime] isEqualToString:@"0"]) {
            //如果不在线 先判断之前有没有保存过 不在线的值

            if (dicc[@"3"]) {
                //如果没有自己的头像
                cell.imageview.image = graimage;
            }else{
            cell.imageview.image = dicc[@"0"];
            }
               cell.busyOr.hidden = YES;
               //没有保存了生成值

        }
        else if ([dicc[lasttime] isEqualToString:@"2"]) {

            if (dicc[@"3"]) {
                //如果没有自己的头像
                cell.imageview.image = imagehold;
            }else{
                    cell.imageview.image = dicc[@"1"];
            }
            cell.busyOr.hidden = NO;

    }
    }else{
        //没有值

        if ([model.status isEqualToString:@"1"]) {

                dicc =[NSMutableDictionary  dictionary];

                    //在线
                    [cell.imageview sd_setImageWithURL:[NSURL URLWithString:model.headimage] placeholderImage:[UIImage imageNamed:HeadPortraitDoctor]];

            if (model.headimage.length>0) {
                //判断 是否有自己的头像,如果有了 加载
                UIImage * image =[UIImage createGrayCopy:cell.imageview.image];
                [dicc setObject:image forKey:@"0"];
                [dicc setObject:cell.imageview.image forKey:@"1"];
            }else{
                //没有了 直接添加字典@“3”  下次判断,显示
                [dicc setObject:@"default" forKey:@"3"];
            }

                    [dicc setObject:@"1" forKey:lasttime];
                    [arrayAllImage setObject:dicc forKey:model.uid];

             cell.busyOr.hidden = YES;
            }
        else if([model.status isEqualToString:@"0"]){
            //不在线
            cell.busyOr.hidden = YES;

            dicc =[NSMutableDictionary  dictionary];

            UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:model.headimage]]];
                        NSLog(@"%@",model.headimage);

            if (model.headimage.length>0) {
            cell.imageview.image = [UIImage createGrayCopy:image];
             [dicc setObject:image forKey:@"1"];
             [dicc setObject:cell.imageview.image forKey:@"0"];
             }else{
                 cell.imageview.image=graimage ;
                 [dicc setObject:@"default" forKey:@"3"];
             }

                            [dicc setObject:@"0" forKey:lasttime];

                            [arrayAllImage setObject:dicc forKey:model.uid];

        }
        else if([model.status isEqualToString:@"2"]){
            //忙碌

                dicc =[NSMutableDictionary  dictionary];

                    //在线
                    [cell.imageview sd_setImageWithURL:[NSURL URLWithString:model.headimage] placeholderImage:[UIImage imageNamed:HeadPortraitDoctor]];

            if (model.headimage.length>0) {
                UIImage * image =[UIImage createGrayCopy:cell.imageview.image];
                [dicc setObject:image forKey:@"0"];
                [dicc setObject:cell.imageview.image forKey:@"1"];

            }else{

                [dicc setObject:@"default" forKey:@"3"];
            }

                    [dicc setObject:@"2" forKey:lasttime];

                    [arrayAllImage setObject:dicc forKey:model.uid];

            cell.busyOr.hidden = NO;
        }

    }

    if(!ScrollerYesNo){
        //给图片标记
        cell.imageview.tag = indexPath.row+200;

    [[GetUrlSession shareUrlconnection]connetion:[NSString stringWithFormat:@"%@?uid=%rt=%@",seartatusGet,mod,model.port] Haget:^(NSDictionary *data, NSError *error, NSHTTPURLResponse *response) {

            NSString* onlineStatue = [NSString stringWithFormat:@"%@",data[@"status"]];

            dispatch_async(dispatch_get_main_queue(), ^{

                NSMutableDictionary * diccc = [NSMutableDictionary dictionary];
                [diccc setDictionary: arrayAllImage[model.uid]];

                //判断当前的状态。  以及是否上一次的状态值
                if ([onlineStatue isEqualToString:@"1"] && ![onlineStatue isEqualToString:diccc[lasttime]]) {

                    UIImageView *lastImageView = [self.view viewWithTag:indexPath.row+200];

                    if (![lastImageView isEqual:cell.imageview]) {

                        return ;
                    }

                    if (dicc[@"3"]) {
                        //如果没有自己的头像
                        cell.imageview.image = imagehold;
                    }else{
                            cell.imageview.image =diccc[@"1"];
                    }
                        [diccc setObject:@"1" forKey:lasttime];

                        [arrayAllImage setObject:diccc forKey:model.uid];

                    cell.busyOr.hidden = YES;

                }else if([onlineStatue isEqualToString:@"0"]  && ![onlineStatue isEqualToString:diccc[lasttime]]){
                    //不在线
                    cell.busyOr.hidden = YES;

                    UIImageView *lastImageView = [self.view viewWithTag:indexPath.row+200];

                    if (![lastImageView isEqual:cell.imageview]) {

                        return ;
                    }
                    if (dicc[@"3"]) {
                        //如果没有自己的头像
                        cell.imageview.image = graimage;
                    }else{
                         cell.imageview.image=diccc[@"0"];
                    }
                                [diccc setObject:@"0" forKey:lasttime];

                                [arrayAllImage setObject:diccc forKey:model.uid];

                }
                else if([onlineStatue isEqualToString:@"2"]  && ![onlineStatue isEqualToString:diccc[lasttime]]  ){
                    //忙碌

                    UIImageView *lastImageView = [self.view viewWithTag:indexPath.row+200];

                    if (![lastImageView isEqual:cell.imageview]) {

                        return ;
                    }

                    if (dicc[@"3"]) {
                        //如果没有自己的头像
                        cell.imageview.image = imagehold;
                    }else{
                            cell.imageview.image = diccc[@"1"];
                    }
                        [diccc setObject:@"2" forKey:lasttime];

                        [arrayAllImage setObject:diccc forKey:model.uid];

                    cell.busyOr.hidden = NO;
                }

            });

        }];

    }

        return cell;

				
时间: 2025-01-05 16:15:28

iOS tableViewCell 在cell赋值、网络加载照片位置偏移大小错乱,做一个类似qq列表的tableview的相关文章

iOS开发>学无止境 - Cell异步图片加载优化,缓存机制详解

作者:勤奋的笨老头 网址:http://www.jianshu.com/p/02ab2b74c451 最近研究了一下UITbleView中异步加载网络图片的问题,iOS应用经常会看到这种界面.一个tableView上显示一些标题.详情等内容,在加上一张图片.这里说一下这种思路. 为了防止图片多次下载,我们需要对图片做缓存,缓存分为内存缓存于沙盒缓存,我们当然两种都要实现. 由于tableViewCell是有重用机制的,也就是说,内存中只有当前可见的cell数目的实例,滑动的时候,新显示cell会

iOS网络加载图片缓存与SDWebImage

加载网络图片可以说是网络应用中必备的.如果单纯的去下载图片,而不去做多线程.缓存等技术去优化,加载图片时的效果与用户体验就会很差. 一.自己实现加载图片的方法 tips: *iOS中所有网络访问都是异步的.(自己开线程去下载) *普通为模型增加UIImage属性的方法做的是内存缓存(下次启动还需要从网络重新加载), 而要做本地缓存的话,还要自己手动存储网络上下载的图片. *为了加快访问, 还需要自己去弄缓存.(内存缓存或者本地缓存) *当图片没有下载完成时,还要设置占位图片. 以下代码用NSOp

【iOS】网络加载图片缓存与SDWebImage

加载网络图片可以说是网络应用中必备的.如果单纯的去下载图片,而不去做多线程.缓存等技术去优化,加载图片时的效果与用户体验就会很差. 一.自己实现加载图片的方法 tips: *iOS中所有网络访问都是异步的.(自己开线程去下载) *普通为模型增加UIImage属性的方法做的是内存缓存(下次启动还需要从网络重新加载), 而要做本地缓存的话,还要自己手动存储网络上下载的图片. *为了加快访问, 还需要自己去弄缓存.(内存缓存或者本地缓存) *当图片没有下载完成时,还要设置占位图片. 以下代码用NSOp

网络加载数据及单例工具类的代码抽取

今天给大家分享一一下网络加载数据:先看代码吧-------------------------- - (void)diseaseNumWithFinishedBlock:(FinishedBlocks)finishedBlock{ NSString *urlStr = @"http://数据接口"; NSDictionary *prama = @{响应参数}; [[NetWorkTool sharedNetWorkTool] POST:urlStr parameters:prama p

SDWebImage在UITableView部分CELL图片无法加载的解决办法

开始在cell中是使用这个函数来加载图片的. [self.photoView sd_setImageWithURL:[NSURL URLWithString: [post objectForKey: @"thumb_url"]] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {...} 非常简洁的API,好舒服.但是在tableview第一次加载数据的时候

网络多线程 ---实现网络加载图片

案例要求:网络加载图片,随机加载到设置好的视图上 实现的效果图如下: 具体代码如下: // //  ViewController.m //  0603---NSOperationQueue #import "ViewController.h" @interface ViewController () @property (nonatomic,strong) NSMutableArray * imageArray; @end @implementation ViewController

android快捷开发之Retrofit网络加载框架的简单使用

大家都知道,安卓最大的特点就是开源化,这自然会产生很多十分好用的第三方API,而基本每一个APP都会与网络操作和缓存处理机制打交道,当然,你可以自己通过HttpUrlConnection再通过返回数据进行解析解决,而我们自己学的东西大多数情况下都没有针对网络很糟糕的情况进行优化.下面就给大家带来Square Inc这家有创新精神的公司留下的Retrofit网络加载库的使用! Retrofit封装了从Web API下载数据,解析成一个普通的java对象(POJO),这里我们就去天狗网使用他们的一个

iOS和tvOS游戏按需加载资源简介

摘要 与iOS 9和watchOS 2一起,苹果引入了一套新的内容分发API,以便节约设备空间,这就是按需加载资源.通过使用按需加载资源,我们可以将特定的应用程序资源托管在苹果的服务器上,然后在需要的时候进行加载.在这个教程中,我将通过开发一个图片查看应用介绍一下按需加载资源的基本用法. tvOS On Demand Reourse 按需加载 iOS开发 目录[-] 介绍 准备工作 1. 按需加载资源 益处 类别 限制 应用分片 删除按需加载资源 2. 分配和指定Tag 3. 访问按需请求资源

三种基本网络加载图片方式

代码片段(6) [全屏查看所有代码] 1. [代码]普通加载网络方式     ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 public class NormalLoadPictrue {