【无限互联】上下拉刷新瀑布流

上下拉刷新瀑布流功能实现思路:

在Scrollview上面放三个UIView代表每一个列,然后在每个UIview上添加图片,每次都是挑最短的UIView,把图片添加上去;

工具类:JSONKIT,SDWebImage,开源类上下拉控件SVPullToRefresh



**************ViewController**************

- (void)viewDidLoad

{

    [superviewDidLoad];

    //解析数据

    NSString *path = [[NSBundlemainBundle]pathForResource:@"Data"ofType:@"json"];

    NSString *string = [[NSStringalloc]initWithContentsOfFile:pathencoding:NSUTF8StringEncodingerror:nil];

   NSArray *array = [string objectFromJSONString];

    NSMutableArray *arrayImage = [[NSMutableArrayalloc]init];

    

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

       NSDictionary *dataD = [array objectAtIndex:i];

       if (dataD) {

           ImageInfo *imageInfo = [[ImageInfoalloc]initWithDictionary:dataD];

            //数组存储图片Model,然后添加到数组,Model的属性有图片宽,高,和图片的url

            [arrayImageaddObject:imageInfo];

        }

    }

   NSLog(@"%@",arrayImage);

    

   self.waterView = [[ImageWaterViewalloc]initWithDataArray:arrayImagewithFrame:CGRectMake(0,0, 320, 460)];


    //添加上拉加载更多

   __weak ViewController *blockSelf =self;

    [self.waterViewaddInfiniteScrollingWithActionHandler:^{

       NSLog(@"上拉刷新");

        //使用GCD开启一个线程,使圈圈转1

       int64_t delayInSeconds = 1.0;

       dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds *NSEC_PER_SEC);

       dispatch_after(popTime, dispatch_get_main_queue(), ^(void){

            [blockSelf.waterViewloadNextPage:arrayImage]; //加载第一页图片

            [blockSelf.waterView.infiniteScrollingViewstopAnimating];

        });

    }];

    //添加下拉刷新(实际上就是加载到第一页的图片)

    [self.waterViewaddPullToRefreshWithActionHandler:^{

       NSLog(@"下拉更新");

        //使用GCD开启一个线程,使圈圈转1

       int64_t delayInSeconds = 1.0;

       dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds *NSEC_PER_SEC);

       dispatch_after(popTime, dispatch_get_main_queue(), ^(void){

            [blockSelf.waterViewrefreshView:arrayImage]; //刷新瀑布流

            [blockSelf.waterView.pullToRefreshViewstopAnimating];

        });

    }];

    [self.viewaddSubview:self.waterView];

}


**************滑动视图 ImageWaterView**************

-(void)initParameter

{

    //每一列的视图初始化

    firstView = [[UIViewalloc]initWithFrame:CGRectMake(0,0, WIDTH,0)];

    secondView = [[UIViewalloc]initWithFrame:CGRectMake(WIDTH,0, WIDTH,0)];

    thridView = [[UIViewalloc]initWithFrame:CGRectMake(WIDTH*2,0, WIDTH,0)];

   

    //最高列,最低列,最高列高度,行数

    higher = row = highValue = lower = 1;

    countImage = 0;

    

   for (int i =0; i<self.arrayImage.count; i++) {

        //0%3=0,0-23也不可能大于0

       if (i/3>0 && i%3==0) {

           row++;

        }

        ImageInfo *data = (ImageInfo*)[self.arrayImageobjectAtIndex:i];

        

       countImage ++;

       //添加视图

        [selfaddViews:data with:countImage];

        //重新设置最高和最低view

        [selfsetHigherAndLower];

    }

    

    [selfsetContentSize:CGSizeMake(WIDTH,highValue)];

    [selfaddSubview:firstView];

    [selfaddSubview:secondView];

    [selfaddSubview:thridView];

}

//填充图片并把图片的位置传过来

-(void)addViews:(ImageInfo *)image with:(int)a

{

    //要添加到列上的图片对象

   SelfImageVIew *imageView = nil;

    //图片的高度

   float imageHeight = 0;

    //创建每列的视图填充的内容

   /*

     1、创建自定义的图片对象

     2、记住该图片的高度

     3、重新定义每列的大小,就是高度

     4、把该图片加到每列上。

     */

    //在最低的那一列添加图片

   switch (lower) {

       case 1:

            imageView = [[SelfImageVIewalloc]initWithImageInfo:imagey:firstView.frame.size.heightwithA:a];

            imageHeight = imageView.frame.size.height;

           firstView.frame =CGRectMake(firstView.frame.origin.x,firstView.frame.origin.y,WIDTH, firstView.frame.size.height + imageHeight);

            [firstViewaddSubview:imageView];

           break;

       case 2:

            imageView = [[SelfImageVIewalloc]initWithImageInfo:imagey:secondView.frame.size.height withA:a];

            imageHeight = imageView.frame.size.height;

           secondView.frame =CGRectMake(secondView.frame.origin.x,secondView.frame.origin.y,WIDTH, secondView.frame.size.height + imageHeight);

            [secondViewaddSubview:imageView];

           break;

       case 3:

            imageView = [[SelfImageVIewalloc]initWithImageInfo:imagey:thridView.frame.size.height withA:a];

            imageHeight = imageView.frame.size.height;

           thridView.frame =CGRectMake(thridView.frame.origin.x,thridView.frame.origin.y,WIDTH, thridView.frame.size.height + imageHeight);

            [thridViewaddSubview:imageView];

           break;

       default:

           break;

    }

    imageView.delegate =self;

}

//找到最高最低列,记录最高列的高

-(void)setHigherAndLower

{

   float firstHeight = firstView.frame.size.height;

   float secondHeight = secondView.frame.size.height;

   float thridHeight = thridView.frame.size.height;

    //比较哪一列是最高的那列,并记录最高的值highValue和最高的列higher

   if (firstHeight > highValue) {

       highValue = firstHeight;

       higher = 1;

    }elseif (secondHeight > highValue){

       highValue = secondHeight;

       higher = 2;

    }elseif (thridHeight > highValue){

       highValue = thridHeight;

       higher = 3;

    }

    //找了最低列

   if (firstHeight < secondHeight) {

       if (firstHeight <= thridHeight) {

           lower = 1;

        }else{

           lower = 3;

        }

    }else{

       if (secondHeight <= thridHeight) {

           lower = 2;

        }else{

           lower = 3;

        }

    }

}



//刷新瀑布流

-(void)refreshView:(NSArray*)array

{

    [firstViewremoveFromSuperview];

    [secondViewremoveFromSuperview];

    [thridViewremoveFromSuperview];

    firstView = nil;

    secondView = nil;

    thridView = nil;

   self.arrayImage = array;

    [selfinitParameter];

    

}

//加载下一页瀑布流

-(void)loadNextPage:(NSArray*)array

{

   for (int i =0; i<array.count; i++) {

        //0%3=0,0-23也不可能大于0

       if (i/3>0 && i%3==0) {

           row++;

        }

       ImageInfo *data = (ImageInfo*)[arrayobjectAtIndex:i];

       countImage++;

       //添加视图

        [selfaddViews:data with:countImage];

        //重新设置最高和最低view

        [selfsetHigherAndLower];

    }

    [selfsetContentSize:CGSizeMake(WIDTH,highValue)];


}


****************子类化的视图SelfImageVIew,往视图上添加图片****************

-(id)initWithImageInfo:(ImageInfo*)imageInfo y:(float)y  withA:(int)a

{

    

   float imageW = imageInfo.width;

   float imageH = imageInfo.height;

    //缩略图宽度和宽度

   float width = WIDTH -SPACE;

   float height = width * imageH / imageW;


   self = [superinitWithFrame:CGRectMake(0, y,WIDTH, height + SPACE)];

   if (self) {

       self.data = imageInfo;

       UIImageView *imageView = [[UIImageViewalloc]initWithFrame:CGRectMake(SPACE /2 , SPACE /2 , width, height)];

       NSURL *url = [NSURLURLWithString:imageInfo.thumbURL];

        //利用SDWebImage设置图片

        [imageView setImageWithURL:urlplaceholderImage:nil];

        imageView.backgroundColor = [UIColorgreenColor];

        [selfaddSubview:imageView];

        //图片的张数显示

       UILabel *labe = [[UILabelalloc]initWithFrame:CGRectMake(SPACE /2, height - 20 +SPACE, width, 20)];

        labe.backgroundColor = [UIColorcolorWithRed:1green:1 blue:1 alpha:0.5];

        labe.text = [NSStringstringWithFormat:@"%i张图片",a];

        self.backgroundColor = [UIColorwhiteColor];

        [selfaddSubview:labe];

    }

    return self;

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值