转载:

屎壳郎情调-成长日记

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

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

 #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(, , , )];
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:];
self.arrayWidth = [[NSMutableArray alloc] initWithCapacity:];
@try {
if(dataDic!=nil)
{
if(self.arrayProductDetail==nil)
{
self.arrayProductDetail = [[NSMutableArray alloc] initWithCapacity:]; }
else
{
[self.arrayProductDetail removeAllObjects];
[self.arrCopy removeAllObjects];
}
for (int i = ; 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:]];
[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 ;
} else {
return ;
}
}
//cell高度 这个是关键点
- (CGFloat)quiltView:(TMQuiltView *)quiltView heightForCellAtIndexPath:(NSIndexPath *)indexPath
{ if(self.arrayHeight.count>)
{
float cell_height = 0.9*viewWidth/*[[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 = ;

@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 -  - kTMPhotoQuiltViewMargin,

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

}

@end

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

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

ios 瀑布流的那些事情的更多相关文章

  1. IOS 瀑布流UICollectionView实现

    IOS 瀑布流UICollectionView实现 在实现瀑布流之前先来看看瀑布流的雏形(此方法的雏形 UICollectionView) 对于UICollectionView我们有几点注意事项 它和 ...

  2. iOS 瀑布流之栅格布局

    代码地址如下:http://www.demodashi.com/demo/14760.html 一 .效果预览 二.确定需求 由下面的需求示意图可知模块的最小单位是正方形,边长是屏幕宽除去边距间隔后的 ...

  3. iOS 瀑布流封装

    代码地址如下:http://www.demodashi.com/demo/12284.html 一.效果预览 功能描述:WSLWaterFlowLayout 是在继承于UICollectionView ...

  4. IOS 瀑布流

    本篇博客应该算的上CollectionView的高级应用了,从iOS开发之窥探UICollectionViewController(一)到今天的(五),可谓是由浅入深的窥探了一下UICollectio ...

  5. iOS瀑布流实现(Swift)

    这段时间突然想到一个很久之前用到的知识-瀑布流,本来想用一个简单的方法,发现自己走入了歧途,最终只能狠下心来重写UICollectionViewFlowLayout.下面我将用两种方法实现瀑布流,以及 ...

  6. iOS 瀑布流的Demo

    /** * 瀑布流Demo的主要代码,若想看完整的代码请到下面链接去下载 * * 链接: https://pan.baidu.com/s/1slByAHB 密码: r3q6 */ #import &l ...

  7. iOS 瀑布流的基本原理

    /** * 源代码链接 * 链接: https://pan.baidu.com/s/1nvLamEX 密码: kya5 */ #import <UIKit/UIKit.h> @interf ...

  8. ios瀑布流

    http://blog.csdn.net/shenjx1225/article/details/9037631

  9. iOS开发笔记15:地图坐标转换那些事、block引用循环/weak–strong dance、UICollectionviewLayout及瀑布流、图层混合

    1.地图坐标转换那些事 (1)投影坐标系与地理坐标系 地理坐标系使用三维球面来定义地球上的位置,单位即经纬度.但经纬度无法精确测量距离戒面积,也难以在平面地图戒计算机屏幕上显示数据.通过投影的方式可以 ...

随机推荐

  1. 零基础快速入门SpringBoot2.0教程 (四)

    一.JMS介绍和使用场景及基础编程模型 简介:讲解什么是小写队列,JMS的基础知识和使用场景 1.什么是JMS: Java消息服务(Java Message Service),Java平台中关于面向消 ...

  2. Qt之QThread随记

    这是一篇随记,排版什么的就没有那么好了:) 首先要知道,一个线程在资源分配完之后是以某段代码为起点开始执行的,例如STL内的std::thread,POSIX下的pthread等,都是以函数加其参数之 ...

  3. vue入门之vue-cli安装项目

    第一步先安装nmp 在node.js的官网下载即可. 第二步 直接安装刚下载好的node.js即可,(这里建议不要修改node.js的安装路径),傻瓜式直接下一步即可 检测是否安装成功: 在cmd的控 ...

  4. Python基础2-Python中文乱码(转)

    转自:https://blog.csdn.net/apache0554/article/details/53889253 前言:中文编码问题一直是程序员头疼的问题,而Python2中的字符编码足矣令新 ...

  5. Centos 安装python 3.7 ,同时兼容python2.7

    下载Python源码 从http://www.python.org/download/根据需要的版本下载源文件. 例如上图就是我在官网直接找到3.5.6版本的下载页面,点击的tar源码包进行下载. 1 ...

  6. 工具之UltraEdit之正则表达式

  7. 【CSS】CSS 的优先级总结

    样式的优先级 多重样式(Multiple Styles):如果外部样式.内部样式和内联样式同时应用于同一个元素,就是使多重样式的情况. 一般情况下,优先级如下: (外部样式)External styl ...

  8. python爬虫入门八:多进程/多线程

    什么是多线程/多进程 引用虫师的解释: 计算机程序只不过是磁盘中可执行的,二进制(或其它类型)的数据.它们只有在被读取到内存中,被操作系统调用的时候才开始它们的生命期. 进程(有时被称为重量级进程)是 ...

  9. Java中创建(实例化)对象的五种方式

    Java中创建(实例化)对象的五种方式1.用new语句创建对象,这是最常见的创建对象的方法. 2.通过工厂方法返回对象,如:String str = String.valueOf(23); 3.运用反 ...

  10. 有三个线程T1 T2 T3,如何保证他们按顺序执行

    T3先执行,在T3的run中,调用t2.join,让t2执行完成后再执行t3 在T2的run中,调用t1.join,让t1执行完成后再让T2执行 public class JoinTest {     ...