UICollectionView的简单介绍

UICollectionView的结构

  1. Cells
  2. Supplementary Views 追加视图 (类似Header或者Footer
  3. Decoration Views 装饰视图 (用作背景展示)

由两个方面对UICollectionView进行支持

和tableView一样,即提供数据的UICollectionViewDataSource以及处理用户交互的UICollectionViewDelegate。

另一方面 对于cell的样式和组织方式,由于collectionView比tableView要复杂得多,因此没有按照类似于tableView的style的方式来定义,而是专门使用了一个类来对collectionView的布局和行为进行描述,这就是UICollectionViewLayout

而我们主要讲UICollectionViewLayout,因为这不仅是collectionView和tableView的最重要求的区别,也是整个UICollectionView的精髓所在

UICollectionViewLayoutAttributes类的介绍

一个UICollectionViewLayoutAttributes对象管理着一个Collection View中给定的一个Item的布局有关的属性。当被CollectionView要求时布局对象创建这个类的实例。

  1. open class UICollectionViewLayoutAttributes : NSObject, NSCopying, UIDynamicItem {
  2.  
  3. open var frame: CGRect item的位置
  4.  
  5. open var center: CGPoint item的中心点 这个中心点是在给定的Collection View坐标系中的点。设置这个属性的值也会更新frame属性中的origin的值。
  6.  
  7. open var size: CGSize item的大小
  8.  
  9. open var transform3D: CATransform3D item的放射变化 使用你指定的放射变换赋值给这个属性替换transform3D属性的值
  10.  
  11. @available(iOS 7.0, *)
  12. open var bounds: CGRect
  13.  
  14. @available(iOS 7.0, *)
  15. open var transform: CGAffineTransform item在平面上的变化
  16.  
  17. open var alpha: CGFloat item的透明度 0 - 1
  18.  
  19. open var zIndex: Int // default is 0 item指定在Z轴上的位置 这个属性被用来确定在布局时Item的前后顺序。大的zIndex值的Item会被显示在小的zIndex值的Item上面。这个属性使用相同的值的Item的顺序是不确定的。
      这个属性的值默认为0
  20.  
  21. open var isHidden: Bool // As an optimization, UICollectionView might not create a view for items whose hidden attribute is YES
  22.  
  23. open var indexPath: IndexPath Collection ViewItem的索引值。
      索引包含了一个Section的索引和一个Item在这个Section中的索引。这两个值标示在Collection View唯一的对应的Item的位置。
  24.  
  25. open var representedElementCategory: UICollectionElementCategory { get } Item的类型。
      你可以使用这个属性的值来区分这个布局属性是用于一个Cell还是Supplementary View还是Decoration View
  26.  
  27. open var representedElementKind: String? { get } // nil when representedElementCategory is UICollectionElementCategoryCell
    目标视图的布局指定标识符。
    你可以使用这个属性的值来标识Supplementary View或者Decoration View相关联的属性给定的目的。如果representedElementCategory属性为UICollectionElementCategoryCell,那么这个    属性为nil
  1. }
  1. typedef NS_ENUM(NSUInteger, UICollectionElementCategory) {
  2. UICollectionElementCategoryCell, // Cell
  3. UICollectionElementCategorySupplementaryView, // Supplementary View
  4. UICollectionElementCategoryDecorationView // Decoration View
  5. };

自定义UICollectionViewLayout

UICollectionViewLayout的功能是向UICollectionView提供布局信息 不仅包括cell的布局信息,也包括追加视图和装饰视图的布局信息。实现一个自定义layout的常规做法是继承UICollectionViewLayout类,然后重载下列方法:

准备方法被自动调用 以保证layout实例的正确 为即将进行的layout作前期的计算

  1. open func prepare()

返回指定区域中的Cell和View的属性

返回的是包含UICollectionViewLayoutAttributes的数组  UICollectionViewLayoutAttributes可以是数组 追加视图(头尾视图)的信息

  1. func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]?
  1. 返回对应于indexPath的位置的cell的布局属性
  1. func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes?
  1. 返回对应于indexPath的位置的追加视图的布局属性,如果没有追加视图可不重载
创建并返回一个表示给定索引值对应的Supplementary View的布局属性对象。
使用这个方法为Collection View中的一个Supplementary View创建一个布局属性对象。和Cell一样,Supplementary View当前的数据是被Collection View数据源所管理的。但是和Cell不同的是,Supplementary View通常是为特殊目的而设计的。例如,HeaderFooterCell的放置位置不同,是提供给在单个的Section或者整个Collection View的。
由你来决定如何使用indexPath参数来识别一个给定的Supplementary View。通常,你使用elementKind属性来确定Supplementary View的类型,然后使用indexPath的信息来识别不同Supplementary View实例。
  1. func layoutAttributesForSupplementaryView(ofKind elementKind: String, at indexPath: IndexPath) -> UICollectionViewLayoutAttributes?
创建并返回一个表示给定索引值对应的Decoration View的布局属性对象。
使用这个方法为Collection View中的一个Decoration View创建一个布局属性对象。Decoration ViewSupplementary View的一种,但是不会展示被Collection View数据源所管理的数据。相反,它们大多数为一个Section或者整个Collection View呈现视觉装饰效果。
由你来决定如何使用indexPath参数来识别一个给定的Decoration View。通常,你使用decorationViewKind属性来确定Decoration View的类型,然后使用indexPath的信息来识别不同Decoration View实例。
  1. func layoutAttributesForDecorationView(ofKind elementKind: String, at indexPath: IndexPath) -> UICollectionViewLayoutAttributes?

当边界发生改变的时候 是否应该刷新布局 如果YES则在边界变化(一般是scroll到其他地方)时,将重新计算需要的布局信息。

func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool

方法的调用顺序

  1. )-(void)prepareLayout 设置layout的结构和初始需要的参数等。
  2.  
  3. ) -(CGSize) collectionViewContentSize 确定collectionView的所有内容的尺寸。
  4.  
  5. )-(NSArray *)layoutAttributesForElementsInRect:(CGRect)rect初始的layout的外观将由该方法返回的UICollectionViewLayoutAttributes来决定。
  6.  
  7. )在需要更新layout时,需要给当前layout发送
  8. )-invalidateLayout 该消息会立即返回,并且预约在下一个loop的时候刷新当前layout
  9. )-prepareLayout
  10. )依次再调用-collectionViewContentSize和-layoutAttributesForElementsInRect来生成更新后的布局。

iOS 关于自定义UICollectionViewLayout实现复杂布局的更多相关文章

  1. 自定义UICollectionViewLayout 布局实现瀑布流

    自定义 UICollectionViewLayout 布局,实现瀑布流:UICollectionView和UICollectionViewCell 另行创建,这只是布局文件, 外界控制器只要遵守协议并 ...

  2. 自定义UICollectionViewLayout并添加UIDynamic - scorpiozj(转)

    转载自:http://www.tuicool.com/articles/jM77Vf     自定义UICollectionViewLayout并添加UIDynamic UICollectionVie ...

  3. 自定义UICollectionViewLayout 实现瀑布流

    今天研究了一下自定义UICollectionViewLayout. 看了看官方文档,要自定义UICollectionViewLayout,需要创建一个UICollectionViewLayout的子类 ...

  4. 自定义UICollectionViewLayout并添加UIDynamic

    大家也可以到这里查看. UICollectionView是iOS6引入的控件,而UIDynamicAnimator是iOS7上新添加的框架.本文主要涵盖3部分: 一是简单概括UICollectionV ...

  5. 自定义UICollectionViewLayout之CATransform3D

    1.自定义UICollectionViewLayout旋转效果 之前有自定义UICollectionViewLayout(适用于多个section),本文是一个对cell进行CATransform3D ...

  6. iOS 如何自定义UISearchBar 中textField的高度

    iOS 如何自定义UISearchBar 中textField的高度 只需设置下边的方法就可以 [_searchBar setSearchFieldBackgroundImage:[UIImage i ...

  7. iOS 隐藏自定义tabbar

    iOS  隐藏自定义tabbar -(void)viewWillAppear:(BOOL)animated { NSArray *array=self.tabBarController.view.su ...

  8. ios 实现自定义状态栏StatusBar 和 导航栏navigationBar 的状态和颜色

    很多app中可以看到不同与导航栏的状态栏的颜色,他妈的真绕嘴. 一.更改状态栏颜色 (StatusBar) 就是比如导航栏是红色的状态栏是绿色的. 要实现这样的效果其实很简单,就是添加一个背景view ...

  9. Android 自定义View及其在布局文件中的使用示例(三):结合Android 4.4.2_r1源码分析onMeasure过程

    转载请注明出处 http://www.cnblogs.com/crashmaker/p/3549365.html From crash_coder linguowu linguowu0622@gami ...

随机推荐

  1. linux下使用tc(Traffic Control) 流量控制命令模拟网络延迟和丢包

    目录 TC案例 TC常用命令 TC安装 TC原理介绍 TC规则 TC操作原理 TC命名规则 TC单位 TC命令 TC案例 如何使用tc模拟网络延迟和丢包 修改网络延时:  sudo tc qdisc  ...

  2. CSS之Position全面认识

    CSS的很多其他属性大多容易理解,比如字体,文本,背景等.有些CSS书籍也会对这些简单的属性进行大张旗鼓的介绍,而偏偏忽略了对一些难缠的属 性讲解,有避重就轻的嫌疑.CSS中主要难以理解的属性包括盒型 ...

  3. php 按汉字首字母查询[转载]

    <?php function getfirstchar($s0){ //获取单个汉字拼音首字母.注意:此处不要纠结.汉字拼音是没有以U和V开头的 $fchar = ord($s0{0}); if ...

  4. 36氪Plus消息:贷款组合推荐工具“钱小二”已获数百万天使轮融资

    根据"钱小二"在创业者社区36氪plus上的更新信息,该团队已获得数百万天使轮融资,投资方及投资时间不明. "钱小二"是一个贷款搜索 + 贷款组合推荐平台,目标 ...

  5. 通过windows自带的系统监视器来查看IIS并发连接数(perfmon.msc)

    如果要查看IIS连接数,最简单方便的方法是通过“网站统计”来查看,“网站统计”的当前在线人数可以认为是当前IIS连接数.然而,“网站统计”的当前在线人数统计时间较长,一般为10分钟或15分钟,再加上统 ...

  6. 一次httpserver优化的经验和教训(silverlight游戏 - 金庸群侠传X0.5上线记)

    金X因为被推荐到ACFUN游戏排行第一名.并同一时候在17YY.7K7K.U77.17173等各大小游戏站点上线.迎来了在线用户数量的爆炸式增长.眼下各大站点使用外链方式.也就是实际链接到金X官网的s ...

  7. C语言基础(13)-函数

    一. 函数的原型和调用 在使用函数前必须定义或者声明函数. double circle(double r); int main() { ); printf("length = %f\n&qu ...

  8. iOS开发探索-图片压缩处理

    介绍: 压: 指文件体积变小,但是像素数不变,长宽尺寸不变,那么质量可能下降.缩: 指文件的尺寸变小,也就是像素数减少,而长宽尺寸变小,文件体积同样会减小. 应用: 在实际开发中,我们经常会对图片进行 ...

  9. gstreamer 10.5版本发布啦

  10. js 把字符串当做方法执行

    <SCRIPT LANGUAGE="JavaScript"> function test(str){ alert(str); } eval('test("aa ...