1.layout:
制定UIcollectionView所使用的布局对象,它可支持Flow,Custom两个属性值,如果制定Flow属性值,表明使用
1.1UICollectionViewFlowLayout
UICollectionViewFlowLayout布局对象。如果制定Custom属性值,则表明将会使用自定义的UIcollectionViewLayout布局对象
UICollectionViewFlowLayout布局采用“流"的方式管理UICV中国年的所有单元格,这些单元格要么横向排列,要么纵向排列,其效果就像一个网格
scrollDirection:用于控制单元格滚动方向
minimumLineSpacing:用于控制单元格之间的最小行间距
minmumInteritemSpacing: 最小列间距
itemSize:单元格的宽度和高度
sectionInset:该属性用于设置各分区上下左右空白区域的大小
headerReferenceSize:各分区页眉控件大小
footerReferenceSize:页脚控件大小
1.2UICollectionViewLayout
ScollDirection 设计来源于UICVFL...
Accessories 是否显示UICV分区的页眉页脚
UICollectionView同样采用分区(Section)和多个单元格(Cell)同样使用NSIndexPath分装单元格位置信息
初始化---------------
UICollectionViewFlowLayout* layout=[[UICollectionViewFlowLayoutalloc]init];
//一个网格的大小
layout.itemSize=CGSizeMake(130,100);
//滚动的方向
layout.scrollDirection=0;
ViewController* view=[[ViewControlleralloc]
initWithCollectionViewLayout:layout];
是UICollectionViewFlowLayout不是UICollectionViewLayout
网格的cell需要自定义
.m----------------------------此类继承了UICollectionView
#import"ViewController.h"
#import"CollectionViewCell.h"
@interfaceViewController()
{
NSMutableArray* imageDataArr;
NSMutableArray* nameDataArr;
}
@end
@implementationViewController
staticNSString*constreuseIdentifier =@"Cell";
- (void)viewDidLoad {
[superviewDidLoad];
self.collectionView.backgroundColor=[UIColorwhiteColor];
// Uncomment the following line to preserve selection between presentations
// self.clearsSelectionOnViewWillAppear = NO;
// Register cell classes
[self.collectionViewregisterClass:[CollectionViewCellclass]forCellWithReuseIdentifier:reuseIdentifier];
imageDataArr=[NSMutableArrayarray];
nameDataArr=[NSMutableArrayarray];
for(inti=0;i<20; i++) {
[imageDataArraddObject:[NSStringstringWithFormat:@"%d",i+1]];
[nameDataArraddObject:[NSStringstringWithFormat:@"%d",i+1]];
}
// Do any additional setup after loading the view.
}
- (void)didReceiveMemoryWarning {
[superdidReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
/*
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
#pragma mark
-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView*)collectionView{
return1;
}
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
#warning Incomplete implementation, return the number of items
NSLog(@"%d",imageDataArr.count);
returnimageDataArr.count;
}
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
NSLog(@"1123");
CollectionViewCell* cell=[collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath];
cell.LLabel=nameDataArr[indexPath.row];
cell.imageView.image=[UIImage imageNamed:imageDataArr[indexPath.row]];
// Configure the cell
returncell;
}
自定义cell-------------------------------------------
@implementationmyCollectionViewCell
-(UILabel*)LName{
if(!_LName) {
_LName=[[UILabelalloc]initWithFrame:CGRectMake(20,130,80,30)];
}
return_LName;
}
-(UIImageView*)imageView{
if(!_imageView) {
_imageView=[[UIImageViewalloc]initWithFrame:CGRectMake(10,0,110,120)];
}
return_imageView;
}
//collectionView初始化cell时,使用的是initWithFrame:(CGRect)方法
- (instancetype)initWithFrame:(CGRect)frame
{
self= [superinitWithFrame:frame];
if(self) {
[selfaddSubview:self.imageView];
[selfaddSubview:self.LName];
}
returnself;
}
-----------------------------------------
-(void)prepareForSegue:(UIStoryboardSegue*)segue sender:(id)sender{
//获取激发该跳转的单元格
myCollectionViewCell* cell=(myCollectionViewCell*)sender;
//获取该店元格所在的NSIndexPath
NSIndexPath* indexPath=[self.collectionViewindexPathForCell:cell];
//获取跳转的目标视图控制器
detailViewController* detailController=segue.destinationViewController;
//将选中单元格内的数据传给控制器对象
detailController.imageView.image=[UIImageimageNamed:[NSStringstringWithFormat:@"%ld",indexPath.row]];
detailController.LName.text=[NSStringstringWithFormat:@"%ld",indexPath.row+1];
}
为了让用户单击某个单元格时,应用现实下一个视图控制器,并通过下一个视图控制器显示用户所选择的单元格数据,此时可以结束segue——在UICV的单元格与刚添加的视图控制器之间建立的push类型的 segue
10.19.2 使用UICollectionViewDelegateFlowLayout定制布局 这是一个协议
如果直接使用UICVFL布局对象来管理UICV所有单元格,那么这些单元格的大小,单元格之间的间距和行距都是相同的
UICollectionViewDelegateFlowLayout可以定制单元格大小参差不齐的网格
-collectionView:layout:sizeForItemAtIndexPath:该方法返回的CGSize返回的CGSize对象将控制制定NSIndexPath对应的单元格的大小
-collectionView:layout:insetForSectionAtIndex:该方法返回的UIEdgeInsets对象将控制指定分区上下左右空白区域的大小
-collectionView:layout:minimumLineSpacingForSectionAtIndex: 控制制定分区内最小的行间距
...miniInteritemSpacingForSectionAtIndex:控制指定分区内最小的列间距
...collectionView:layout:referenceSizeForHeadernSection:该方法返回的CGSize将控制制定分区的也没空间的大小
...FooterInsection:该方法返回的CGSize控制分区的也叫大小
-(void)collectionView:(UICollectionView*)collectionView didSelectItemAtIndexPath:(NSIndexPath*)indexPath{
row=indexPath.row;
[selfcollectionView:collectionViewlayout:collectionView.collectionViewLayoutsizeForItemAtIndexPath:indexPath];
[self.collectionViewreloadData];
}
-(CGSize)collectionView:(UICollectionView*)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath*)indexPath{
UIImage* image=[UIImageimageNamed:[NSStringstringWithFormat:@"%ld",indexPath.row+1]];
//获取单元格将要显示的图片
if(indexPath.row==row) {
returnCGSizeMake(120*3,120*3);
}
returnCGSizeMake(120,160);
}
10.19.3 扩展UICollectionViewLayout定制布局
-prepareLayout:开始布局时调用该方法执行准备工作
-layoutAttributesForElementsInRect:指定NSRect区域内所有单元格的大小和位置等布局信息
-layoutAttributesForItemAtIndexPath: 该方法的返回值控制指定NSIndexPath对应的单元格大小和位置等布局信息
-layoutAttributesForSupplementaryViewOfKind:atIndexPath;控制指定分区的yemeikongjian 也叫空间的大小和位置等布局信息
-layoutAttributesForDecorationViewOfKindLatIndePah:装饰空间的大小和位置等布局信息
控制UICollectionView中单元格显示 隐藏时的动画效果,重写一下常用方法:
-initialLayoutAttributesForAppearingItemAtIndexPath:每当单元格动态增加时,自动调用该方法
-initialLayoutAttributesForSupplementaryViewOfKind:atIndexPath;页眉页脚动态增加时
-initialLayoutAttributesForAppearingDecorationElementOfKingd:atIndexPath:装饰控件动态增加时
-finalLayoutAttributesForDisappearingItemAtIndexPath:每当单元格动态消失时,自动调用该方法
-finalLayoutAttributesForDisappearingSupplementaryElementOfKind:atIndexPath:制定的页眉或页脚控件动态消失时自动调用该方法
-finalLayoutAttributesForDisappearingDecorationElementOfKingd:atIndexPath: 装饰控件动态消失
环形布局的UICollectionView
------------------------------------------
问题:
1.多个滚动方向
只能有一个滚动方向
2.UICollectionViewFlowLayout 和UICollectionViewLayout的区别
FlowLayout是Layout的子类。
flowLayout中封装了很多Layout没有的实用方法
比如://一个网格的大小
layout.itemSize=CGSizeMake(130,100);
//滚动的方向
layout.scrollDirection=0;