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(, , , )];
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
http://download.csdn.net/detail/aa741649143/6518895
ios 瀑布流的那些事情的更多相关文章
- IOS 瀑布流UICollectionView实现
IOS 瀑布流UICollectionView实现 在实现瀑布流之前先来看看瀑布流的雏形(此方法的雏形 UICollectionView) 对于UICollectionView我们有几点注意事项 它和 ...
- iOS 瀑布流之栅格布局
代码地址如下:http://www.demodashi.com/demo/14760.html 一 .效果预览 二.确定需求 由下面的需求示意图可知模块的最小单位是正方形,边长是屏幕宽除去边距间隔后的 ...
- iOS 瀑布流封装
代码地址如下:http://www.demodashi.com/demo/12284.html 一.效果预览 功能描述:WSLWaterFlowLayout 是在继承于UICollectionView ...
- IOS 瀑布流
本篇博客应该算的上CollectionView的高级应用了,从iOS开发之窥探UICollectionViewController(一)到今天的(五),可谓是由浅入深的窥探了一下UICollectio ...
- iOS瀑布流实现(Swift)
这段时间突然想到一个很久之前用到的知识-瀑布流,本来想用一个简单的方法,发现自己走入了歧途,最终只能狠下心来重写UICollectionViewFlowLayout.下面我将用两种方法实现瀑布流,以及 ...
- iOS 瀑布流的Demo
/** * 瀑布流Demo的主要代码,若想看完整的代码请到下面链接去下载 * * 链接: https://pan.baidu.com/s/1slByAHB 密码: r3q6 */ #import &l ...
- iOS 瀑布流的基本原理
/** * 源代码链接 * 链接: https://pan.baidu.com/s/1nvLamEX 密码: kya5 */ #import <UIKit/UIKit.h> @interf ...
- ios瀑布流
http://blog.csdn.net/shenjx1225/article/details/9037631
- iOS开发笔记15:地图坐标转换那些事、block引用循环/weak–strong dance、UICollectionviewLayout及瀑布流、图层混合
1.地图坐标转换那些事 (1)投影坐标系与地理坐标系 地理坐标系使用三维球面来定义地球上的位置,单位即经纬度.但经纬度无法精确测量距离戒面积,也难以在平面地图戒计算机屏幕上显示数据.通过投影的方式可以 ...
随机推荐
- C#Aspose操作Word & Excel简版(后会研究补充更多功能)
利用Aspose操作Word & Excel首先要在项目中标引用Aspose.Words.dll和Aspose.Cells.dll. 首先说一说向Word中写入数据,目前做的是向Word中的标 ...
- Android驱动开发5-7总结
Android深度探索5-7章总结 介绍了S3C6410开发板的功能,开发板的不同主要是在烧录嵌入式系统的方式不同,以及如何在此开发板上安装Android.紧接着学到介绍到如何在多种平台,使用多种方式 ...
- Vim编辑器基础命令
Linux系统中都默认安装了vi或vim编辑器,两种命令基本一致.vim为Vi IMproved,功能更强大. vim有命令模式,输入模式,和末行模式三种. ➢ 命令模式:控制光标移动,可对文本进行复 ...
- pymysql模块操作数据库及连接报错解决方法
import pymysql sql = "select host,user,password from user" #想要执行的MySQL语句 #sql = 'create da ...
- java设计模式1--单例模式
1:单例模式简介 单例模式是一种常用的软件设计模式,它确保某个类只有一个实例,而且自行实例化并向整个系统提供唯一的实例.总而言之就是在系统中只会存在一个对象,其中的数据是共享的 特点: 单例类只能有一 ...
- 如何使用koa实现socket.io官网的例子
socket.io官网中使用express实现了一个最简单的IM即时聊天,今天我们使用koa来实现一下 ### 框架准备 确保你本地已经安装好了nodejs和npm,使用koa要求node版本> ...
- Django框架基础知识01-配置环境
Django框架 Django是个怎样的东西呢? Web应用框架----Django http服务器:用来接受用户请求,并将请求转发给web应用框架进行处理. Web应用框架处理完以后再发送给htt ...
- Network of Schools POJ - 1236 (强联通)
一些学校连接到了一个计算机网络.网络中的学校间有如下约定:每个学校维护一个列表,当该学校收到软件或信息后将会转发给列表中的所有学校(也就是接收方列表).需要注意的是如果B学校在A学校的接收方列表中,A ...
- 9 RESTful API
1 RESTful API 2 post创建一个视频 put帖子加精,delete删除 3 自定义状态码 4 5 6 7 8
- Python协程详解(二)
上一章,我们介绍了Python的协程,并讲到用yield达到协程的效果,这一章,我们来介绍yield from的结构和作用 我们先来对比下yield和yield from的用法 def first_g ...