本篇:进行UICollectionView的学习
提示:以下是本篇文章正文内容,下面案例可供参考
UICollectionView
是我们常说的集合视图,是iOS开发者中最受欢迎的UI控件之一。其布局灵活可变,可用于显示有限数据项集,最常见的用途是网格的形式显示item,初次之外还可以通过子类化UICollectionViewLayOut泪,精准的控制可视化元素布局,并动态改变布局,可以实现网格,堆栈,圆形,动态变化,和任何能想象到的布局
data source用于提供呈现数据的视图对象
Collection View layout用于提供视图布局信息
Collection view负责将数据和布局信息整合后呈现到屏幕上
创建UICollectionView对象时,必须传递一个UICollectionViewLayout对象,而UICollectionViewLayout对象不能直接使用,必须使用其子类,在创建网格布局时一般使用其子类UIConllectionViewFlowLayout的子类
UICollectionView是比UItableView更强大的一个控件。
用途 | 类/协议 | 描述 |
---|---|---|
集合视图和集合视图控制器 | UIConllectionView,UIConllectionViewController | UICollectionView派生于UIScrollerView,定义集合视图内容区域,将layout的布局信息和dateSource的数据整合后呈现到屏幕上 |
内容控制 | UICollectionViewDataSource协议,UICollectionViewDelegate协议 | dataSource为集合视图提供数据,是UICollectionView中最重要、必须提供的对象。要实现dataSource中的方法,必须创建一个遵守UICollectionViewDataSource协议的对象。通过UICollectionView的delegate对象可以监听集合视图状态、自定义视图。例如,使用delegate跟踪item是否高亮、选中。与数据源对象不同,代理对象不是必须实现 |
呈现视图 | UICollectionReusableView ,UICollectionViewCell | UICollectionView中的所有视图都必须是UICollectionReusableView类的实例。该类支持回收机制,特别是在华东屏幕时。UICollectionViewCell用来显示主要数据 |
布局 | UICollectionViewLayout,UICollectionViewLayoutAttributes,UICollectionViewUpdateItem | UICollectionViewLayout的子类为集合视图内元素提供位置,带下,视觉属性等布局信息。在布局构成中,layout对象创建UICollectionViewLayoutAttributes实例,告诉item如何布局 。当collectionView的数据源发生插入,删除,移动等变化时,UICollectionView会创建UICollectionViewUpdateItem类的实例,并发送给layout的prepareForCollectionViewUpdates:方法,layout会为即将到来的布局变化作准备 |
Flowlayout | UICollectionViewFlowLayout,UICollectionViewDelegateFlowLayout协议 | UIC哦来了抽屉哦那Vi额外FlowLayout类时用于实现网格或其他基于行布局的具体类,可以直接用,也可以将其于UICollectionViewDelegateFlowLayout代理结合使用, |
UiCollectionViewLayout,UICollectionViewReusableView类必须子类化才可以使用,其他类可以直接使用
UICollectionView使用了视图回收机制以提高性能,当视图被滑出屏幕时,不回删除视图,而是置于重用队列中。当UiCollectionView显示新的内容时,将从重用队列中获取视图。为便于回收和重用,UiCollectionView显示的所有视图必须派生UICollectionReusableView
UICollectionView的数据源对象负责提供cell和supplementaryView,但dataSource从来不会直接创建cell,supplementaryView。当需要展示视图时,如果队列存在所需类型的视图,则会直接出列所需视图,如果队列没有所需视图,则会利用提供的nib文件,storyboard或代码创建。
// ViewController.h
// CollectionView
//
//
#import
@interface ViewController : UIViewController
<UICollectionViewDelegate,
UICollectionViewDataSource>
@property (strong, nonatomic) UICollectionView* collectionView;
@property (strong, nonatomic) UICollectionViewFlowLayout* flowLayout;
@end
// ViewController.m
// CollectionView
//
//
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.flowLayout = [[UICollectionViewFlowLayout alloc] init];
self.flowLayout.scrollDirection = UICollectionViewScrollDirectionVertical;
self.flowLayout.itemSize = CGSizeMake(self.view.frame.size.width/5 - 20, self.view.frame.size.height / 5 - 20);
self.collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) collectionViewLayout:self.flowLayout];
self.collectionView.delegate = self;
self.collectionView.dataSource = self;
[self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"111"];
[self.view addSubview:self.collectionView];
// Do any additional setup after loading the view.
}
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView{
return 1;
}
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
return 10;
}
- (UICollectionViewCell*)collectionView:(UICollectionView*)collectionView cellForItemAtIndexPath:(nonnull NSIndexPath *)indexPath{
UICollectionViewCell* cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"111" forIndexPath:indexPath];
cell.backgroundColor = [UIColor grayColor];
UILabel* lab = [[UILabel alloc] init];
lab.frame = CGRectMake(10, 10, 30, 30);
lab.text = @"1111";
[cell.contentView addSubview:lab];
return cell;
}
@end
//设置item间距大小
- (CGFloat)collectionView:(UICollectionView*)collectionView layout:(nonnull UICollectionViewLayout *)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section{
return 20;
}