ios 瀑布流的那些事情

转载:

屎壳郎情调-成长日记

首先要知道:瀑布流的核心就是要获取到图片的长宽

网上的很多例子都是加载本地图片的 对于新手而言 改成加载网络图片的确是有点压力的  因为本地的图片 我们是很容易就能获取到他的 长宽的 但是网络图片的话 我们只能是先加载图片 然后得到他的长宽 这个时候就涉及到 异步加载图片的问题了  我们现在的思路是 获取网络图片地址 然后 开辟线程来加载该地址的图片 从而获取他的长宽 

 #import "shopRViewController.h"
#import "TMQuiltView.h"

#import "TMPhotoQuiltViewCell.h"

@interface shopRViewController ()<TMQuiltViewDataSource,TMQuiltViewDelegate>
{
    TMQuiltView *qtmquitView;
}
@property (nonatomic, retain) NSMutableArray *images;
@end

@implementation shopRViewController

@synthesize images = _images;

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.view setBackgroundColor:[[UIColor grayColor] colorWithAlphaComponent:0.2]];
    //请求数据
    self.factory = [[DataFactory alloc] initDataWithUrlString:ChanPinTuiJianHttpUrl vHttpMethod:@"post"];
    self.factory.delegate = self;
    qtmquitView = [[TMQuiltView alloc] initWithFrame:CGRectMake(0, 0, 1024, 768)];
    qtmquitView.delegate = self;
    qtmquitView.dataSource = self;
    
    [self.view addSubview:qtmquitView];
    
    
//    [self createHeaderView];
//    [self performSelector:@selector(testFinishedLoadData) withObject:nil afterDelay:0.0f];
    
}
//解析数据
-(void)JsonDataDictionaryDetail:(NSMutableDictionary *)dataDic
{
    self.arrayHeight = [[NSMutableArray alloc] initWithCapacity:1];
     self.arrayWidth = [[NSMutableArray alloc] initWithCapacity:1];
    @try {
        if(dataDic!=nil)
        {
            if(self.arrayProductDetail==nil)
            {
                self.arrayProductDetail = [[NSMutableArray alloc] initWithCapacity:1];
                
            }
            else
            {
                [self.arrayProductDetail removeAllObjects];
                [self.arrCopy removeAllObjects];
            }
            for (int i = 0; i<[[dataDic objectForKey:@"data"] count]; i++) {
                ProdectDetail *p = [[ProdectDetail alloc] init];
                p.ID = [dataDic objectForKey:@"data"][i][@"id"];
                p.img = [dataDic objectForKey:@"data"][i][@"img"];
                p.title = [dataDic objectForKey:@"data"][i][@"title"];
                p.marketprice = [NSString stringWithFormat:@"%.2f",[[dataDic objectForKey:@"data"][i][@"marketprice"] floatValue]];
                p.sellprice  =[NSString stringWithFormat:@"%.2f",[[dataDic objectForKey:@"data"][i][@"sellprice"] floatValue]];
                p.guige = [dataDic objectForKey:@"data"][i][@"guige"];
                p.hots = [dataDic objectForKey:@"data"][i][@"hots"];
                [self.arrayProductDetail addObject:p];
                //开辟线程来加载图片
                [self performSelectorInBackground:@selector(backgr:) withObject:p];
            }
            self.arrCopy = [NSMutableArray arrayWithArray:self.arrayProductDetail];
           
        }
        else
        {
            [self Msg:@"当前无网络连接!"];
        }
        
    }
    @catch (NSException *exception) {
        
    }
   
   [qtmquitView reloadData];
}
//线程加载图片获取 长 宽
-(void)backgr:(ProdectDetail *)p
{
    NSURL *url = [NSURL URLWithString:p.img];
    UIImage *imga = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:url]];
    [self.arrayWidth addObject:[NSString stringWithFormat:@"%f",imga.size.width]];
    [self.arrayHeight addObject:[NSString stringWithFormat:@"%f",imga.size.height]];
    //更新主线程
   [self performSelectorOnMainThread:@selector(updateMain) withObject:nil waitUntilDone:NO];
}
//刷新主线程做的事情
-(void)updateMain
{
    //主线层要做的事情就是刷新布局
    //刷新布局
    [qtmquitView reloadData];
}

//cell的个数
- (NSInteger)quiltViewNumberOfCells:(TMQuiltView *)TMQuiltView {
    return self.arrayWidth.count;//注意 这个count要跟 子线程里面的组数个数一致 (之前越界了 原来问题处在这里)
}
//cell事件
- (TMQuiltViewCell *)quiltView:(TMQuiltView *)quiltView cellAtIndexPath:(NSIndexPath *)indexPath {
    TMPhotoQuiltViewCell *cell = (TMPhotoQuiltViewCell *)[quiltView dequeueReusableCellWithReuseIdentifier:@"PhotoCell"];
    if (!cell) {
        cell = [[[TMPhotoQuiltViewCell alloc] initWithReuseIdentifier:@"PhotoCell"] autorelease];
    }
    ProdectDetail *p = [self.arrayProductDetail objectAtIndex:indexPath.row];
   //  cell.photoView.image = [self imageAtIndexPath:indexPath];
    [cell.photoView setImageWithURL:[NSURL URLWithString:p.img]];
    [cell.titleLabel setFont:[UIFont systemFontOfSize:15]];
    [cell.headLabel setTextColor:[UIColor orangeColor]];
    cell.headLabel.text = [NSString stringWithFormat:@"¥ %@",p.sellprice];
    cell.titleLabel.text = [NSString stringWithFormat:@"%@%d",p.title, indexPath.row];
    return cell;
}

#pragma mark - TMQuiltViewDelegate
//设备旋转
- (NSInteger)quiltViewNumberOfColumns:(TMQuiltView *)quiltView {
    
    
    if ([[UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeLeft
        || [[UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeRight)
    {
        return 3;
    } else {
        return 4;
    }
}
//cell高度  这个是关键点
- (CGFloat)quiltView:(TMQuiltView *)quiltView heightForCellAtIndexPath:(NSIndexPath *)indexPath
{
    
    if(self.arrayHeight.count>0)
    {
        float cell_height = 0.9*viewWidth/4*[[self.arrayHeight objectAtIndex:indexPath.row] floatValue]/[[self.arrayWidth objectAtIndex:indexPath.row] floatValue];
        
        return cell_height;
    }
}
//选中事件要做的事情
- (void)quiltView:(TMQuiltView *)quiltView didSelectCellAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"index:%d",indexPath.row);
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


@end

demo使用注意点:

 

使用方法

在TMQuiltView.m里面 修改间距 

constCGFloat kTMQuiltViewDefaultMargin = 5.0f;      //修改间距

 

修改Cell的布局样式 在 TMPhotoQuiltViewCell.m里面 添加布局样式

 

添加布局 

/

 

 

#import "TMPhotoQuiltViewCell.h"

 

constCGFloat kTMPhotoQuiltViewMargin = 5;

 

@implementation TMPhotoQuiltViewCell

 

@synthesize photoView =_photoView;

@synthesize titleLabel =_titleLabel;

 

- (void)dealloc {

    [_photoView release], _photoView =nil;

    [_titleLabel release], _titleLabel =nil;

    

    [superdealloc];

}

 

- (id)initWithReuseIdentifier:(NSString *)reuseIdentifier

{

   self = [superinitWithReuseIdentifier:reuseIdentifier];

   if (self) {

        self.backgroundColor = [UIColorwhiteColor];

    }

    return self;

}

 

- (UIImageView *)photoView {

   if (!_photoView) {

       _photoView = [[UIImageViewalloc] init];

        _photoView.contentMode =UIViewContentModeScaleAspectFill;

       _photoView.clipsToBounds =YES;

        [selfaddSubview:_photoView];

    }

    return_photoView;

}

 

//

//注意 添加的的布局一定要你写成这样 get set 形式否则会闪屏  

//

//

 

 

- (UILabel *)titleLabel {

    if (!_titleLabel) {

       _titleLabel = [[UILabelalloc] init];

        _titleLabel.backgroundColor = [[UIColorblackColor] colorWithAlphaComponent:0.5];

       _titleLabel.textColor = [UIColorwhiteColor];

        _titleLabel.textAlignment =UITextAlignmentCenter;

        [selfaddSubview:_titleLabel];

    }

    return_titleLabel;

}

//布局

- (void)layoutSubviews {

    self.photoView.frame =CGRectInset(self.bounds,kTMPhotoQuiltViewMargin, kTMPhotoQuiltViewMargin);

 

    //下标题

    self.titleLabel.frame =CGRectMake(kTMPhotoQuiltViewMargin,self.bounds.size.height - 20 - kTMPhotoQuiltViewMargin,

                                      self.bounds.size.width -2 * kTMPhotoQuiltViewMargin,20);

}

@end

demo下载地址 (加载本地图片的)

http://download.csdn.net/detail/aa741649143/6518895

原文地址:https://www.cnblogs.com/henusyj-1314/p/6149077.html