• UICollectionViewLayout


    UICollectionViewLayout的功能为向UICollectionView提供布局信息。实现一个自定义layout的常规做法是继承UICollectionViewLayout类,然后重载下列方法:

     1 /// UICollectionViewLayout的方法
     2 /**
     3  返回collectionView的内容的尺寸(注意:这里的尺寸不是可视部分的尺寸,应该所有内容的尺寸,以便系统来配置UICollectionView滚动行为)
     4  */
     5 - (CGSize)collectionViewContentSize;
     6 
     7 /** 
     8  布局之前,自动调用(子类重写必须调用该方法的父类方法,一般在该方法中设计一些初始需要的参数等)
     9  */
    10 - (void)prepareLayout;
    11 
    12 /** 
    13  返回rect中的所有的元素的布局属性<数组内都是UICollectionViewLayoutAttributes的实例对象>,根据UICollectionViewLayoutAttributes初始化方法不同可以得到UICollectionView不同组件的信息(UICollectionViewLayoutAttributes初始化方法在下面给出)
    14  */
    15 - (nullable NSArray<__kindof UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect;
    16 
    17 /** 
    18  返回对应于indexPath的位置的cell的布局属性
    19  */
    20 - (nullable UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath;
    21 
    22 /** 
    23  返回对应于indexPath的位置的追加视图的布局属性(没有追加视图可不重载)
    24  */
    25 - (nullable UICollectionViewLayoutAttributes *)layoutAttributesForSupplementaryViewOfKind:(NSString *)elementKind atIndexPath:(NSIndexPath *)indexPath;
    26 
    27 /** 
    28  返回对应于indexPath的位置的装饰视图的布局属性(没有装饰视图可不重载)
    29  */
    30 - (nullable UICollectionViewLayoutAttributes *)layoutAttributesForDecorationViewOfKind:(NSString*)elementKind atIndexPath:(NSIndexPath *)indexPath;
    31 
    32 /** 
    33  需要更新Layout之前,需要调用该方法(是否允许重新计算需要的布局信息)一般设为YES.
    34  */
    35 - (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds;

    UICollectionViewLayoutAttributes初始化方法:

     1 /// UICollectionViewLayoutAttributes初始化方法:
     2 /** 
     3  得到cell的UICollectionViewLayoutAttributes的实例,根据实例对象可以得到cell的信息
     4  */
     5 + (instancetype)layoutAttributesForCellWithIndexPath:(NSIndexPath *)indexPath;
     6 
     7 /** 
     8  得到的是头部或尾部的UICollectionViewLayoutAttributes的实例,根据实例对象可以得到头部或尾部的信息
     9  */
    10 + (instancetype)layoutAttributesForSupplementaryViewOfKind:(NSString *)elementKind withIndexPath:(NSIndexPath *)indexPath;
    11 
    12 /** 
    13  得到的是装饰图的UICollectionViewLayoutAttributes的实例,根据实例对象可以得到装饰图的信息
    14  */
    15 + (instancetype)layoutAttributesForDecorationViewOfKind:(NSString *)decorationViewKind withIndexPath:(NSIndexPath *)indexPath;

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

     1 /** 
     2  首先,该方法将被调用,默认下该方法什么没做,但是在自己的子类实现中,一般在该方法中设定一些必要的layout的结构和初始需要的参数等。
     3  */
     4 - (void)prepareLayout;
     5 
     6 
     7 /** 
     8  然后,该方法将被调用,以确定collection应该占据的尺寸。注意这里的尺寸不是指可视部分的尺寸,而应该是所有内容所占的尺寸。collectionView的本质是一个scrollView,因此需要这个尺寸来配置滚动行为。
     9  */
    10 - (CGSize) collectionViewContentSize;
    11 
    12 
    13 /** 
    14  接下来,该方法被调用。初始的layout的外观将由该方法返回的UICollectionViewLayoutAttributes来决定。
    15  */
    16 - (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect;
    17 
    18 
    19 /** 
    20  另外,在需要更新layout时,需要给当前layout发送 -invalidateLayout,该消息会立即返回,并且预约在下一个loop的时候刷新当前layout,这一点和UIView的setNeedsLayout方法十分类似。在-invalidateLayout后的下一个collectionView的刷新loop中,又会从prepareLayout开始,依次再调用-collectionViewContentSize和-layoutAttributesForElementsInRect来生成更新后的布局。
    21  */
    22 - (void)invalidateLayout;
    23 - (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds;

    尊重作者劳动成果,转载请注明: 【kingdev】

  • 相关阅读:
    STM32 时钟配置分析
    STM32 开发板资源梳理
    STM32 摄像头实验OV2640
    STM32 TFT液晶屏与FSMC
    STM32 开发板电源与供电方式
    视觉里程计07 Qt的一些bug修改记录
    解决wireshark检测不到网卡的问题
    gdb 脚本调试
    [转] GCC 中的编译器堆栈保护技术
    使用gdbserver远程调试
  • 原文地址:https://www.cnblogs.com/xiu619544553/p/5339408.html
Copyright © 2020-2023  润新知