iOS 异步加载网络图片,获取图片真实尺寸

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CJXBShowZhouyujuan/article/details/53715438

项目需求:
在网络上加载一组图片的数据,并且这组图片要按照比例展示出来

做法分析:

(1)首页界面上要是使用的图片控件的创建,这里的高度是用设定的高度,这部分需要在主线程完成;
(2)第二部部分是获取图片的实际尺寸,这部分在线程中完成;
(3)然后需要在主线程刷新frame,并使用sdweb加载图片
参考的网址:
dispatch_group
http://blog.csdn.net/yaoliangjun306/article/details/51462444

dispatch_group_enter
http://blog.csdn.net/u011103194/article/details/50248807

根据Url获取图片的尺寸
http://www.oschina.net/code/snippet_2248391_53038

- (float)createImageView:(NSArray *)imageArray directionStr:(NSString *)str{

    [self removeAllSubviews];

    __block CGFloat allHeight = 0;

    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

    dispatch_group_t group =dispatch_group_create();

    for (int i = 0; i < [imageArray count]; i++) {

第一步:先创建一个固定高度的View,ImageView

        CGFloat showImageH = 600;//自定义图片高度

        //背景View

        UIView * backImageView = [[UIView alloc]initWithFrame:CGRectMake(0,showImageH * i,_houseFrame.size.width, showImageH)];
        backImageView.backgroundColor = [UIColor whiteColor];


        //ImageView

        UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(0,0,_houseFrame.size.width, showImageH)];

        [backImageView addSubview:imageView];
        [self addSubview:backImageView];

        showImageH = imageView.origin.y + imageView.height;

        //imageView属性的设置

        imageView.contentMode = UIViewContentModeScaleToFill;
        imageView.userInteractionEnabled = YES;


        //需要用到的Image的Url

        NSString *urlStr_S = [NSString stringWithFormat:@"%@%@",ImageHeaderURL,imageArray[i]];

        NSURL * urlImage = [NSURL URLWithString:urlStr_S];

第二步:根据图片的URl获取图片的真是尺寸        
       //这里使用group 
        dispatch_group_async(group, queue, ^{

  //这里是获取图片尺寸的方法
            CGSize  size = [Helper getImageSizeWithURL:urlImage];

            CGFloat a = size.width;
            CGFloat b = size.height;
            CGFloat space = 2;

            if(a > _houseFrame.size.width){

                a = _houseFrame.size.width;
                b = size.height*(_houseFrame.size.width)/size.width;
            }

 第三步:在group中使用异步请求是会有问题的,这是因为要刷新主界面了           dispatch_sync(dispatch_get_main_queue(), ^{

                //NSLog(@"main-------i----%d",i);
                [imageView setFrame:CGRectMake(0, 0, a, b)];
                [backImageView setFrame:CGRectMake(0, allHeight, _houseFrame.size.width, b)];
                allHeight+=b+space;
                [self setFrame:CGRectMake(0, 0, _houseFrame.size.width, allHeight)];


            });
    //使用sdwebImage加载图片        
             [imageView sd_setImageWithURL:urlImage];

        });

    }

//等到所有的图片的高度都计算完成了,返回界面刷新高度
    dispatch_group_notify(group, queue, ^{
      //NSLog(@"dispatch_group_notify-------i----");
        if(self.changeHouseType){
            //查看VR和方向的高度
            self.changeHouseType(allHeight);
        }
    });
    return allHeight;
}

猜你喜欢

转载自blog.csdn.net/CJXBShowZhouyujuan/article/details/53715438