上下拉刷新瀑布流功能实现思路:
在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];
}
-(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-2除3也不可能大于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-2除3也不可能大于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;
}