iOS UICollectionView 深度总结

最近一直有朋友问我UICollectionView的用法,感觉还是有很多朋友对UICollectionView不太熟悉,今天抽点空,总结一下UICollectionView的用法,如有错误,欢迎大家提出来。
题纲:
1.最简单的UICollectionView
2.UICollectionViewCell详解
3.UICollectionView的选择
4.UICollectionView的插入删除和移动
5.cell的拷贝和粘贴或者自定义操作
6.自定义布局

接下来就是正文啦!!!:
1.最简单的UICollectionView
UICollectionView是一个使用起来比较复杂的视图,即使是最简单的实现,也必须提供数据源dataSource,和布局方法UICollectionViewLayout,才可以实现一个可见可用的视图效果。

与TableView相同,dataSource需要提供的是

collectionView:numberOfItemsInSection: //返回每段显示的数据个数
collectionView:cellForItemAtIndexPath: // 返回数据的显示cell获取cell必须使用dequeueReusableCellWithReuseIdentifier:forIndexPath:方法,与TableView不同的是,这里不会返回nil,而是必须把cell的类别注册到collectionView供此方法调用,否则会出错。

布局我们使用已经提供的UICollectionViewLayout的子类UICollectionViewFlowLayout,在初始化UICollectionView的时候传入

UICollectionViewFlowLayout *layout = [UICollectionViewFlowLayout new];
UICollectionView *collectionView = [[UICollectionView alloc]initWithFrame:self.view.bounds collectionViewLayout:layout];
collectionView.dataSource = self;
layout.itemSize = CGSizeMake(50, 50); //设定大小

2.UICollectionViewCell详解

UICollectionViewCell不像UITableViewCell一样提供了可用的几种样式,因此建议实现其子类来使用。 子类实现时候的几个注意点:

所有的自定义View需要加入contentView中。

实现prepareForReuse对重用cell进行必要的清理。

定义selectedBackgroundView来实现选中时候的区分背景

使用前先需要先注册:

[collectionView registerClass:[CustomCollectionViewCell class] forCellWithReuseIdentifier:@“MyIdentifier”];

对于段头或者段尾等附加显示的元素,同样需要注册:

[collectionView registerClass:[CustomCollectionViewCell class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader(Footer) withReuseIdentifier:@“HeaderIdentifier"];

并提供相应的dataSource方法:

collectionView:viewForSupplementaryElementOfKind:atIndexPath:

别忘了还需要设置layout:

对于UICollectionViewFlowLayout来说,可以使用

head(foot)erReferenceSize
或者代理方法:- collectionView:layout:referenceSizeForHead(Foot)erInSection:

cell和SupplementaryView的indexPath是分别计数的,互不干扰。SupplementaryView中的Header和Footer计数也是分开的,尽管他们需要在同一个数据方法里面实现。

3.UICollectionView的选择

UICollectionView选择的delegate方法跟UITableView的选择基本一致,这里就不详细说了,比较简单。 略有不同的是,UICollectionView没有默认highlighted的颜色样式,需要自己通过代理方法设置,cell里面是选中的颜色,而不是highlighted的颜色,区别应当注意。

4.UICollectionView的插入删除和移动

与TableView不同,UICollectionView没有默认的删除和插入,也没有代理方法,而是直接调用其类方法即可

- insertItemsAtIndexPaths:  //插入
moveItemAtIndexPath:toIndexPath:  //移动
deleteItemsAtIndexPaths:  //删除

同样可以进行批量操作。

- performBatchUpdates:completion:

5.cell的拷贝和粘贴或者自定义操作
长按cell的时候出现可以出现菜单,这个菜单是由UIMenuController实现的,它包含了剪切、拷贝、粘贴、删除等等操作,要实现这个菜单,必须实现三个方法

collectionView:shouldShowMenuForItemAtIndexPath: //是否弹出菜单,需要返回YES
-  collectionView:canPerformAction:forItemAtIndexPath:withSender: //是否可以弹出事件
假如我们只想使用拷贝和粘贴,可以这样写:
- (BOOL)collectionView:(UICollectionView *)collectionView
      canPerformAction:(SEL)action
    forItemAtIndexPath:(NSIndexPath *)indexPath
            withSender:(id)sender {
   if ([NSStringFromSelector(action) isEqualToString:@"copy:"]
        || [NSStringFromSelector(action) isEqualToString:@"paste:"])
        return YES;
    return NO;
}

- collectionView:performAction:forItemAtIndexPath:withSender: //对事件进行相应操作

6.自定义布局

当UICollectionViewFlowLayout以及其子类不能满足布局的需求时,可以创造UICollectionViewLayout的子类进行自动布局。

简单来讲,自定义布局就是需要提供所有元素的位置,随后,collectionView:cellForItemAtIndexPath等方法会根据layout来请求元素。

自定义自动布局必须需要重写的方法有:
-collectionViewContentSize 
返回collectionView的大小
-layoutAttributesForElementsInRect:
返回区域内元素的属性数组
-layoutAttributesForItemAtIndexPath: 
返回cell的布局属性
-layoutAttributesForSupplementaryViewOfKind:atIndexPath:    
返回SupplementaryView的布局属性(可选)
-layoutAttributesForDecorationViewOfKind:atIndexPath:    
返回DecorationView的布局属性(可选)
-shouldInvalidateLayoutForBoundsChange:
边界变化时是否自动布局,返回BOOL

建议写法
首先实现方法

- (void)prepareLayout {
    此方法中计算出全部元素布局所需要的属性并以indexPath为关键字存入字典
    cell属性的生成方法:
    UICollectionViewLayoutAttributes *attr = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];
    SupplementaryView属性的生成方法:
    UICollectionViewLayoutAttributes *attr = [UICollectionViewLayoutAttributes layoutAttributesForSupplementaryViewOfKind:@"customId" withIndexPath:indexPath];
    根据indexPath确定attr的frame,或者使用center和size属性来确定frame。
    把attr保存到字典中
}

- (CGSize)collectionViewContentSize {
    通过self.collectionView获取相关信息并计算大小
}

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect {
    建立一个可变数组attributes
    遍历所有存储的attr
    如果frame存在于rect中,则加入数组
    if(CGRectIntersectsRect(rect, attr.frame)){
        [attributes addObject:attr];  
    }
    返回数组
}

- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath {
        只需要返回存储字典里的独立属性即可。
}

以上是对UICollectionView的个人总结,大家觉得好,就给个赞吧!!!
转载请注明本文出处!谢谢。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容