• 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

  • 相关阅读:
    llinux文件相关指令
    移除元素【数组专题】
    移动零【数组专题】
    删除数组中重复的元素plus【数组专题】
    TCP超时重传时间的选择
    linux帮助指令
    各种缩写
    MyEclipse开发WebService教程(转)
    RMI 自己创建的 过程
    RMI简单实例 (转)
  • 原文地址:https://www.cnblogs.com/henusyj-1314/p/6149077.html
Copyright © 2020-2023  润新知