iOS讲解迷惑深入浅出值UICollectionView(集合视图)
来源:互联网 发布:重生之网络女主播 编辑:程序博客网 时间:2024/05/21 11:20
1.创建一个集合视图, 先创建网格布局 UICollectionViewFlowLayout, 设置其诸多属性再用其设置好属性的对象 初始化集合视图.- (void)createCollectView{ // UICollectionViewFlowLayout 继承自 UICollectionViewLayout // UICollectionViewLayout 是一个抽象类,该类没有具体功能, 具体的功能是由其子类(UICollectionViewFlowLayout)实现 // Item 布局 (网格状布局) UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init]; // 行边距(相对于垂直滚动) <如果水平滑动行边距就是列边距> flowLayout.minimumLineSpacing = 30; // 列边距(相对于垂直滚动) <如果水平滑动行边距就是列边距> flowLayout.minimumInteritemSpacing = 30; // 设置item的宽高 (就是显示在上面的一小格子) flowLayout.itemSize = CGSizeMake(80, 100); // 自动布局 // 设置滑动方向(默认是上下滑动的), 属性是枚举 flowLayout.scrollDirection = UICollectionViewScrollDirectionVertical; //设置表头, 只有高度影响 (宽度默认是屏幕的宽) flowLayout.headerReferenceSize = CGSizeMake(0, 100); //NSLog(@"%d", index(<#const char *#>, <#int#>)) // 设置表尾 flowLayout.footerReferenceSize = CGSizeMake(50, 100); // 设置内边距 上 左 下 右 !!!!!!!!!!!! 跟构建CGrectMake()差不多 flowLayout.sectionInset = UIEdgeInsetsMake(20, 20, 20, 20); // 用设置好的flowLayout初始化集合视图 UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:[UIScreen mainScreen].bounds collectionViewLayout:flowLayout]; // 设置代理 collectionView.delegate = self; collectionView.dataSource = self; // collectionView 默认黑色, 现在改成白色 collectionView.backgroundColor = [UIColor whiteColor]; // 加到view上 [self.view addSubview:collectionView]; [collectionView release]; [flowLayout release]; //⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️ //⚡️⚡️⚡️⚡️注册你要用的cell⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️ // Identifier:@"MyCell" 重用标识符 一定要 上下一致(这里要和返回cell方法里面的标识符一致) // <#(Class)#> 你的cell是那个类 就填那个类 // 使用系统的类就注册系统的 如果自定义cell就注册自定义的那个类 [collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"MyCell"]; //⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️ // 注册表头 // 注意 Identifier:@"MyHeaderView" 和复用里面一致 [collectionView registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"MyHeaderView"]; // //⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️⚡️ // 注册表尾 [collectionView registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionFooter withReuseIdentifier:@"MyFootView"];}2. 实现代理方法//--------------- dataSouce 代理方法 开始 -------------------------#pragma mark - dataSouce必须实现的代理方法 1 (两个)// 必须实现的两个方法跟tableView一样// 返回每个分区的Item 个数- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{ return 20;}#pragma mark - dataSouce必须实现的代理方法 2 (两个)// 返回cell的样式- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{ // 返回每个item的方法 // 这个方法包括了之前 创建tableViewCell写的一堆 // 必须有一步; 必须要注册cell⚡️⚡️ UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MyCell" forIndexPath:indexPath]; // cell点不出来 textLabel // 系统没有像tableView一样, 给咱们提供布局方式, 咱们要使用UICollectionCiewCell的话, 一般都是自定义cell, 然后加到contentView上面 cell.contentView.backgroundColor = [UIColor colorWithRed:0.817 green:0.000 blue:0.823 alpha:1.000]; return cell; // 不需要释放}// 返回分区数, 跟tableView一样. 默认1个分区- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView{ return 1;}//设置表头 表尾的视图 通过代理方法来实现, 需要注册表头表位 (Reusable可重复的),/** * 设置表头 表尾 通过代理方法来实现 Reusable可重复的 * @param kind 这个参数可以判断是表头还是表尾 因为参数是字符串的不能用等号 * @param indexPath 索引 */// 此方法也是复用- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath{ // 判断返回 表头还是表尾 // (NSString *)kind ,这个参数可以判断是表头还是表尾, 因为参数是字符串的不能用等号 // if ([kind isEqualToString:UICollectionElementKindSectionHeader]) { // 返回表头, 需要去复用集合中得到 UICollectionReusableView *headView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"MyHeaderView" forIndexPath:indexPath]; // 加颜色 headView.backgroundColor = [UIColor greenColor]; return headView; } else { // 返回表尾 UICollectionReusableView *footView =[collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionFooter withReuseIdentifier:@"MyFootView" forIndexPath:indexPath]; footView.backgroundColor = [UIColor blueColor]; return footView; }}开始自定义cell1. 首先创建一个GirlCell类 : 继承自 UICollectionViewCell, 声明属性, 达到的目的: item上面放图片#import <UIKit/UIKit.h>#import "GirlModel.h"@interface GirlCell : UICollectionViewCell// 图片@property (nonatomic, retain) UIImageView *girlImageView;// 声明一个model获取宽高@property (nonatomic, retain) GirlModel *model;@end2. GirlCell.m中重写初始化方法, 在初始化方法中创建控件, 并把控件加到self.contentView上(跟tableView的自定义cell类似)// 重写初始化方法// frame 这个参数 就是cell的frame- (instancetype)initWithFrame:(CGRect)frame{ self = [super initWithFrame:frame]; if (self) {// // 获取frame宽高// CGFloat width = self.frame.size.width;// CGFloat height = self.frame.size.height;//// // 跟 cell 一般大// self.girlImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, width, height)];//// self.girlImageView.backgroundColor = [UIColor colorWithRed:0.867 green:0.000 blue:0.874 alpha:1.000];//// // 添加到显示视图上// [self.contentView addSubview:self.girlImageView];// [_girlImageView release]; // 动态imageView高度 self.girlImageView = [[UIImageView alloc] initWithFrame:CGRectZero]; [self.contentView addSubview:self.girlImageView]; [_girlImageView release]; } return self;}#pragma mark - 重写方法 进行重新布局视图- (void)layoutSubviews{ [super layoutSubviews]; // 重新给imageView一个宽高 CGFloat scale = self.model.width / 150; // 这个150 是itemSize的高度 CGFloat newHeight = self.model.height / scale; // 重新给图片的frame赋值 self.girlImageView.frame = CGRectMake(0, 0, 150, newHeight);}自定义表头视图(创建一个类继承自UICollectionReusableView)#import <UIKit/UIKit.h>@interface HeaderCollectionReusableView : UICollectionReusableView// 声明label 用作表头显示的文字@property (nonatomic, retain) UILabel *titleLabel;@end#import "HeaderCollectionReusableView.h"@implementation HeaderCollectionReusableView.m文件- (void)dealloc{ [_titleLabel release]; [super dealloc];}/** 自定义表头视图 */// 重写初始化方法- (instancetype)initWithFrame:(CGRect)frame{ self = [super initWithFrame:frame]; if (self) { // 初始化自定义视图 self.titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 0, 340, 50)]; self.titleLabel.backgroundColor = [UIColor yellowColor]; // 显示视图 [self addSubview:self.titleLabel]; [_titleLabel release]; } return self;}@end表尾视图(创建一个类继承自UICollectionReusableView)#import <UIKit/UIKit.h>@interface FooterCollectionReusableView : UICollectionReusableView@property (nonatomic, retain) UIImageView *footerImageV;@end#import "FooterCollectionReusableView.h"@implementation FooterCollectionReusableView- (void)dealloc{ [_footerImageV release]; [super dealloc];}/** 自定义表尾视图 */// 初始化控件- (instancetype)initWithFrame:(CGRect)frame{ if (self = [super initWithFrame:frame]) { // 初始化控件 self.footerImageV = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 370, 100)]; self.footerImageV.backgroundColor = [UIColor colorWithRed:0.500 green:0.285 blue:0.074 alpha:1.000]; [self addSubview:self.footerImageV]; [_footerImageV release]; UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(20 , 0, 180, 100)]; label.text = @"这是表尾"; label.font = [UIFont systemFontOfSize:24]; label.textColor = [UIColor redColor]; [self.footerImageV addSubview:label]; [label release]; } return self;}-----------使用---------------——把系统的改成自己创建的类------------------------------------//// RootViewController.m// LessonUICollectionView-GirlImage//// Created by lanou3g on 15/9/21.// Copyright (c) 2015年 nieyinlong. All rights reserved.//#import "RootViewController.h"#import "GirlModel.h"#import "GirlCell.h"#import "HeaderCollectionReusableView.h"#import "FooterCollectionReusableView.h"#import "DetailViewController.h"#import "UIImageView+WebCache.h" // 导入第三方的类目@interface RootViewController ()<UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout>// 声明可变数组 保存model@property (nonatomic, retain) NSMutableArray *dataArray;@end@implementation RootViewController- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. self.navigationItem.title = @"自定义CollectionViewCell"; [self setUpData]; [self createCollectionView];}// 加载数据- (void)setUpData{ // 路径 NSString *path = [[NSBundle mainBundle] pathForResource:@"imageResource" ofType:@"json"]; NSData *data = [NSData dataWithContentsOfFile:path]; NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:(NSJSONReadingMutableContainers) error:nil]; self.dataArray = [NSMutableArray array]; for (NSDictionary *dic in array) { GirlModel *model = [[GirlModel alloc] init]; [model setValuesForKeysWithDictionary:dic]; [self.dataArray addObject:model]; [model release]; /** */ } NSLog(@"%@", self.dataArray);}创建集合视图- (void)createCollectionView{ // 创建网状布局 UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init]; // 设置一堆属性 // 行间距 flowLayout.minimumLineSpacing = 20; // 列间距 flowLayout.minimumInteritemSpacing = 20; // item宽高 flowLayout.itemSize = CGSizeMake(150, 230); // 滑动方向 flowLayout.scrollDirection = UICollectionViewScrollDirectionVertical; // 头 flowLayout.headerReferenceSize = CGSizeMake(100, 100); // 尾 flowLayout.footerReferenceSize = CGSizeMake(0, 200); // 内边距 (上 左 下 右) flowLayout.sectionInset = UIEdgeInsetsMake(20, 20, 20, 20); /*----- 创建集合视图 --- --------------------*/ // 利用flowLayout 创建集合视图 UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:[UIScreen mainScreen].bounds collectionViewLayout:flowLayout]; // 设置代理 collectionView.delegate = self; collectionView.dataSource = self; collectionView.backgroundColor = [UIColor whiteColor]; // 显示视图 [self.view addSubview:collectionView]; // 释放 两个 [flowLayout release]; [collectionView release]; // 注册cell// 改成自己的类 // 注意要注册的标示符 和下面的 返回cell方法里面的cell的标识符一致 [collectionView registerClass:[GirlCell class] forCellWithReuseIdentifier:@"GirlCell"]; // 注册表头 视图 (改成自己的类) [collectionView registerClass:[HeaderCollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"GirlHeader"]; // 注册表尾视图 [collectionView registerClass:[FooterCollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionFooter withReuseIdentifier:@"GirlFooter"];}#pragma mark ----- dataSouece 代理方法 ---- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{ return self.dataArray.count;}#pragma mark - 返回cell- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{ GirlCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"GirlCell" forIndexPath:indexPath]; // 取出cell对于的model GirlModel *model = self.dataArray[indexPath.row]; // 调用第三方类库 (实现异步加载图片) [cell.girlImageView sd_setImageWithURL:[NSURL URLWithString:model.thumbURL] placeholderImage:[UIImage imageNamed:@"picholder@2x"]]; // 把model传进cell中 (那边实现自动布局) cell.model = model; return cell;}// 返回表头 表尾 的视图- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath{ // 判断返回 头还是返回脚 if ([kind isEqualToString:UICollectionElementKindSectionHeader]) { // 从集合队列找, 没有就创建... HeaderCollectionReusableView *headerView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"GirlHeader" forIndexPath:indexPath]; headerView.titleLabel.text = @"这是表头的标题"; return headerView; } else { // 表尾视图 FooterCollectionReusableView *footView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionFooter withReuseIdentifier:@"GirlFooter" forIndexPath:indexPath]; footView.footerImageV.image = [UIImage imageNamed:@"22"]; return footView; }}#pragma mark - 动态高度等比缩放// 返回索引处 item的宽高- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout si zeForItemAtIndexPath:(NSIndexPath *)indexPath{ // 取出对应的model(按索引取出model) GirlModel *model = self.dataArray[indexPath.row]; // 算出图片刻度(或者比例) CGFloat scale = model.width / 150; // 这个150 是item的宽 CGFloat newHeight = model.height / scale; return CGSizeMake(150, newHeight);}- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{ DetailViewController *detVC = [[DetailViewController alloc] init]; detVC.model = self.dataArray[indexPath.row]; [self.navigationController pushViewController:detVC animated:YES]; [detVC release];}@end异步加载图片 创建的model#import <Foundation/Foundation.h>#import <UIKit/UIKit.h>@interface GirlModel : NSObject// 图片网址@property (nonatomic, retain) NSString *thumbURL;// 宽@property (nonatomic, assign) CGFloat width;// 高@property (nonatomic, assign) CGFloat height;/* 接口格式 数组里面存的好多小字典 "thumbURL": "http://img.tupianzj.com/uploads/allimg/140801/1-140P1104S7.jpg", "width": 533, "height": 796 */@end
0 0
- iOS讲解迷惑深入浅出值UICollectionView(集合视图)
- ios讲解迷惑深入浅出之GCD
- iOS讲解迷惑深入浅出之通知
- iOS讲解迷惑深入浅出之懒加载
- iOS开发 -- UICollectionView(集合视图)
- iOS开发:集合视图 UICollectionView
- iOS编程------集合视图UICollectionView
- iOS讲解迷惑深入浅出之SAX解析和JSON 解析
- iOS讲解迷惑深入浅出之基础动画-关键帧动画
- iOS讲解迷惑深入浅出之单例类的两种写法
- iOS讲解迷惑深入浅出之复杂对象的归档
- iOS讲解迷惑深入浅出之block那点事
- iOS讲解迷惑深入浅出之开启子线程请求网络
- iOS个人整理24-集合视图--UICollectionView
- iOS中UICollectionView(集合视图)的使用
- iOS讲解迷惑--LeanCloud
- 关于集合视图UICollectionView
- UICollectionView 集合视图
- MySql基本使用方法
- 深复制和浅复制
- 广播和多播
- 【CS学习】——UML结构
- 阿里巴巴中间件性能挑战赛(MOM篇)
- iOS讲解迷惑深入浅出值UICollectionView(集合视图)
- Charm Bracelet 3624 (01背包)
- linux redis安装源码包安装
- 必须采用初始化列表一共有三种情况
- iOS —— JSON 数据结构及其解析方式
- android使用java代码设置textview、button等内容颜色
- Log4j配置详解及不同的包(package)下的日志写入到不同的日志文件下
- HDU 2203:亲和串【KMP & strstr函数】
- 大数据学习篇:hadoop深入浅出系列之HDFS(八) ——RPC通信