iOS网络图片瀑布流(未知图片高度)

做过瀑布流的都清楚,,后台数据会返回图片的宽高,,经过比例处理会整齐的排列。。collectionview的加载图片的过程是先全部设置好没个item的高度,,添加占位图片,,sdwebimage下载图片,,下载完成显示在对应的imageView,,那么后台不返回尺寸该怎么办??有的demo是在数据处理的时候将图片下载下来,获取尺寸,添加进model里。。在collectionview刷新的时候再给item的尺寸,,这样做可以。。但会比较耗时。。有图片缓存还好,,如果是上拉加载新的图片。。用户体验会特别的差。你就等吧。

与后台沟通后 结果是图片太多了 取尺寸太麻烦,,前台想办法。。。。。

安卓和iOS 都采用了同一个思路 先给一个固定相同的高度,,线程获取图片尺寸,,获取结束后,再刷新高度,,虽然用户体验也极差,,会看到图片突然地变大或变小。。但没找到更好的办法。。下面是我的APP用到的关键代码


#pragma mark  加载数据

- (void)addData{

    __weakTuiJianViewController *weakSelf =self;

    dispatch_async(dispatch_get_global_queue(0,0), ^{

        [[CommuncationsharedInstance] loadShouYeTuiJianWithstart:requestStartlimit:limitsucess:^(id result) {

            /// 断网的情况请求出错时走缓存数据

            if ([resultisKindOfClass:[NSErrorclass]]) {

                self.imagewarr = [NSMutableArrayarray];

                self.imageharr = [NSMutableArrayarray];

                requestResultArray = [NSMutableArrayarray];

                requestResultArray = [NSKeyedUnarchiverunarchiveObjectWithFile:[PathToolthePath:@"TuiJianData"]];

                for (NSDictionary *bodyin requestResultArray) {

                    NSString *imageUrl = imageUrl = body[@"video"][@"cover"];

                    /// 获取图片尺寸的方法,,有缓存从缓存中获取

                    CGSize size = [ImageSizeTool downloadImageSizeWithURL:[NSURLURLWithString:[NSStringstringWithFormat:@"%@%@",URLADDRESS,imageUrl]]];

                    [self.imagewarraddObject:[NSStringstringWithFormat:@"%f",size.width]];

                    [self.imageharraddObject:[NSStringstringWithFormat:@"%f",size.height]];

                }

                [weakSelf.tuijianCollectionViewreloadData];

                [weakSelf.tuijianCollectionView.mj_footerendRefreshing];

                [weakSelf.tuijianCollectionView.mj_headerendRefreshing];

            }else{

                if (!result[@"state"]) {

                    if (result[@"customMessage"]) {

                        [[iToastmakeText:result[@"customMessage"]]show];

                    }

                }else{

                    NSInteger num =requestStart;

                    requestStart =requestStart + [result[@"body"]count];

                    self.imagearr = [NSMutableArrayarray];

                    for (NSDictionary *bodyin result[@"body"]) {

                        if (![requestResultArraycontainsObject:body]) {

                            [requestResultArrayaddObject:body];

                        }

                        NSString *imageUrl = body[@"live"][@"cover"];

                        [self.imagearraddObject:imageUrl];

                        // 获取图片尺寸之前 先设置固定相同的尺寸 添加进宽高尺寸数组,,在你的瀑布流高度返回方法里进行按比例缩                         放,,设置瀑布流的高度

                        [self.imageharraddObject:@"500"];

                        [self.imagewarraddObject:@"900"];

                        [SVProgressHUD dismiss];

                    }

                    // 进行缓存 、、、、 这里的缓存是为断网情况有数据 ,,不是图片的缓存

                    [NSKeyedArchiverarchiveRootObject:requestResultArraytoFile:[PathToolthePath:@"TuiJianData"]];

                    dispatch_async(dispatch_get_main_queue(), ^{

                        [weakSelf.tuijianCollectionViewreloadData];

                        /// 回到主线程获取图片的尺寸

                        [selfjisun:self.imagearrnsinteger:num];

                        [weakSelf.tuijianCollectionView.mj_footerendRefreshing];

                        [weakSelf.tuijianCollectionView.mj_headerendRefreshing];

                    });

                    [SVProgressHUDdismiss];

                }

            }

        }];

    });

}


- (void)jisun:(NSMutableArray *)arr nsinteger:(NSInteger)nsinteger{

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{

        // 耗时的操作

        for (NSInteger i =0; i

下面是一个大神用SDWebImage 实现的瀑布流 github地址:https://github.com/songhailiang/DynamicWaterfall

你可能感兴趣的:(iOS网络图片瀑布流(未知图片高度))