zoukankan      html  css  js  c++  java
  • 自定义的UICollectionViewLayout简介

    自定义的UICollectionViewLayout简介


    UICollectionViewLayout的功能为向UICollectionView提供布局信息,不仅包括cell的布局信息,也包括追加视图和装饰视图的布局信息。

    实现一个自定义layout的常规做法是继承UICollectionViewLayout类,然后重载下列方法:

    • -(CGSize)collectionViewContentSize
      • 返回collectionView的内容的尺寸
    • -(NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
      • 返回rect中的所有的元素的布局属性
      • 返回的是包含UICollectionViewLayoutAttributes的NSArray
      • UICollectionViewLayoutAttributes可以是cell,追加视图或装饰视图的信息,通过不同的UICollectionViewLayoutAttributes初始化方法可以得到不同类型的UICollectionViewLayoutAttributes:
        • layoutAttributesForCellWithIndexPath:
        • layoutAttributesForSupplementaryViewOfKind:withIndexPath:
        • layoutAttributesForDecorationViewOfKind:withIndexPath:
    • -(UICollectionViewLayoutAttributes )layoutAttributesForItemAtIndexPath:(NSIndexPath )indexPath
      • 返回对应于indexPath的位置的cell的布局属性
    • -(UICollectionViewLayoutAttributes )layoutAttributesForSupplementaryViewOfKind:(NSString )kind atIndexPath:(NSIndexPath *)indexPath
      • 返回对应于indexPath的位置的追加视图的布局属性,如果没有追加视图可不重载
    • -(UICollectionViewLayoutAttributes * )layoutAttributesForDecorationViewOfKind:(NSString)decorationViewKind atIndexPath:(NSIndexPath )indexPath
      • 返回对应于indexPath的位置的装饰视图的布局属性,如果没有装饰视图可不重载
    • -(BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds
      • 当边界发生改变时,是否应该刷新布局。如果YES则在边界变化(一般是scroll到其他地方)时,将重新计算需要的布局信息。

    另外需要了解的是,在初始化一个UICollectionViewLayout实例后,会有一系列准备方法被自动调用,以保证layout实例的正确。

    • 首先,-(void)prepareLayout将被调用,默认下该方法什么没做,但是在自己的子类实现中,一般在该方法中设定一些必要的layout的结构和初始需要的参数等。
    • 之后,-(CGSize) collectionViewContentSize将被调用,以确定collection应该占据的尺寸。注意这里的尺寸不是指可视部分的尺寸,而应该是所有内容所占的尺寸。collectionView的本质是一个scrollView,因此需要这个尺寸来配置滚动行为。
    • 接下来-(NSArray *)layoutAttributesForElementsInRect:(CGRect)rect被调用,这个没什么值得多说的。初始的layout的外观将由该方法返回的UICollectionViewLayoutAttributes来决定。
    • 另外,在需要更新layout时,需要给当前layout发送 -invalidateLayout,该消息会立即返回,并且预约在下一个loop的时候刷新当前layout,这一点和UIView的setNeedsLayout方法十分类似。在-invalidateLayout后的下一个collectionView的刷新loop中,又会从prepareLayout开始,依次再调用-collectionViewContentSize和-layoutAttributesForElementsInRect来生成更新后的布局。
  • 相关阅读:
    Java创建和解析Json对象
    Tyche 2191 WYF的递推式
    Tyche 2147 旅行
    Tyche 2317 Color
    洛谷 P1092 虫食算
    洛谷 P3951 小凯的疑惑
    BZOJ 1800 [Ahoi2009]fly 飞行棋
    BZOJ 1034 [ZJOI2008]泡泡堂BNB
    洛谷 P2151 [SDOI2009]HH去散步
    Android开发环境配置
  • 原文地址:https://www.cnblogs.com/sunyanyan/p/5283149.html
Copyright © 2011-2022 走看看