iOS UICollectionView那些我"错过&

作者: 夏天然后 | 来源:发表于2016-08-24 16:06 被阅读2139次

    前言: 这是博主在学习旧知识笔记中的一篇, 谁叫咱入门晚呢, 学习的过程中, 不会的知识, 就是因为我们年轻而已(囧~) 我总是这样安慰自己(逃~), 所以我们需要补充一下"错过"的重要的东西, 下面列出了本文会提到的一些概念. 如不感兴趣直接退出即可
    UICollectionView, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout, UICollectionViewLayout

    在开始之前先有必要回忆一下UICollectionView

    使用collectionView有一段时间了, 进行一个简单的总结和理解~~~.
    UICollectionView是一种类似于UITableView不同于UITableView的布局方式.

    • Cells 用于展示内容的主体,对于不同的cell可以指定不同尺寸和不同的内容, 且可以复用(一般需要自定义 没有提供类似于tableview那么多的属性).
    • Supplementary Views 追加视图 可以理解为tableView每个Section的Header或者Footer,用来标记每个section的view, 且也可以被复用.
    • Decoration Views 装饰视图 这是每个section的背景, 且也可以被复用.

    关于Cell的说明:

    • 首先是cell本身作为容器view
    • 然后是一个大小自动适应整个cell的backgroundView,用作cell平时的背景
    • 再其上是selectedBackgroundView,是cell被选中时的背景
    • 最后是一个contentView,自定义内容应被加在这个view上

    UICollectionViewDataSource

    // 多少个Items
    - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section;
    
    // 显示cell
    - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath;
    
    // 多少个Sections
    - (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView;
    

    实现上面三个方法, 基本就可以正常工作了.

    UICollectionViewDelegate

    进行一些行为操作时候用到的

    • cell的高亮
    • cell的点击
    • cell的选中状态等等.
    对于点击cell发生哪些行为做一个说明

    1collectionView:shouldHighlightItemAtIndexPath: 是否应该高亮?
    2collectionView:didHighlightItemAtIndexPath: 如果1回答为是,那么高亮
    3collectionView:shouldSelectItemAtIndexPath: 无论1结果如何,都询问是否可以被选中?
    4collectionView:didUnhighlightItemAtIndexPath: 如果1回答为是,那么现在取消高亮
    5collectionView:didSelectItemAtIndexPath: 如果3回答为是,那么选中cell

    UICollectionViewDelegateFlowLayout

    可以对cell的大小, 间隙进行调整 使用协议的方式

    UICollectionViewFlowLayout

    是UICollectionViewLayout(稍后会提到)的子类, 他提供一些对cell进行简单设置的属性, Flow Layout简单说是一个直线对齐的layout.

    // 系统API提供的一些属性
    @property (nonatomic) CGFloat minimumLineSpacing;
    @property (nonatomic) CGFloat minimumInteritemSpacing;
    @property (nonatomic) CGSize itemSize;
    @property (nonatomic) CGSize estimatedItemSize NS_AVAILABLE_IOS(8_0); // defaults to CGSizeZero - setting a non-zero size enables cells that self-size via -preferredLayoutAttributesFittingAttributes:
    @property (nonatomic) UICollectionViewScrollDirection scrollDirection; // default is UICollectionViewScrollDirectionVertical
    @property (nonatomic) CGSize headerReferenceSize;
    @property (nonatomic) CGSize footerReferenceSize;
    @property (nonatomic) UIEdgeInsets sectionInset;
    
    // Set these properties to YES to get headers that pin to the top of the screen and footers that pin to the bottom while scrolling (similar to UITableView).
    @property (nonatomic) BOOL sectionHeadersPinToVisibleBounds NS_AVAILABLE_IOS(9_0);
    @property (nonatomic) BOOL sectionFootersPinToVisibleBounds NS_AVAILABLE_IOS(9_0);
    

    UICollectionViewLayout

    它负责了将各个cell、Supplementary View和Decoration Views进行组织,为它们设定各自的属性.可以有:位置, 尺寸, 透明, 层级, 形状, 等等. 所以自定义各种样式的布局就需要自定义Layout了.
    实现一个自定义layout一般继承于UICollectionViewLayout然后需要重写以下几个方法:

    //  返回CollectionView的内容尺寸
    -(CGSize)collectionViewContentSize
    // 返回rect中的所有的元素的布局属性, 返回的是包含UICollectionViewLayoutAttributes的NSArray, UICollectionViewLayoutAttributes可以是cell, Supplementary View和Decoration View
    -(NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
    // 返回对应于indexPath的位置的cell的布局属性
    -(UICollectionViewLayoutAttributes _)layoutAttributesForItemAtIndexPath:(NSIndexPath _)indexPath
    //  返回对应于indexPath的位置的追加视图的布局属性
    -(UICollectionViewLayoutAttributes _)layoutAttributesForSupplementaryViewOfKind:(NSString _)kind atIndexPath:(NSIndexPath *)indexPath
    // 返回对应于indexPath的位置的装饰视图的布局属性
    -(UICollectionViewLayoutAttributes * )layoutAttributesForDecorationViewOfKind:(NSString_)decorationViewKind atIndexPath:(NSIndexPath _)indexPath: 
    // 默认返回yes, 边界发生变化时, 重新进行布局.
    - (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds: 
    

    注意: UICollectionViewLayout实例化之后, 有一些方法将自动被调用

    // 一般在该方法中设定一些必要的layout的结构和初始需要的参数
    -(void)prepareLayout
    // 处置collection应该占据的尺寸(所有内容所占的尺寸) collectionView的本质是一个scrollView, 需要滚动尺寸
    -(CGSize) collectionViewContentSize
    

    需要更新layout时, 调用这个方法 有点UIView的setNeedsLayout的意思...

    - invalidateLayout
    

    说了这么多, 我觉得我理解的更深一点了, 你呢?
    说的再多不如show you my demo 稍后有时间补上... [大笑.png]
    这里是官方的一个Dmeohttps://github.com/mpospese/CircleLayout.git

    End

    ---------------------------------------

    走心文章, 值得点赞 ---文/夏天然后
    微博-点我@夏天是个大人了 || QQ群: 498143780

    可以关注我的订阅号 [夏天然后 ID: xt1005430006]

    夏天然后

    转载获得授权

    相关文章

      网友评论

      • 只因为趁年轻:楼主,问一下, 如果想要 collectionview每组下的 包含cell的 背景色改变颜色,怎么做呢, collectionview的背景色跟每组包含cell 的背景色不是一样的,不是 section的背景色。 类似于京东分类页面 右边数据的显示,有办法么
        夏天然后:@只因为趁年轻 通过Decoration装饰视图这个概念来做, 参考这个应该可以http://www.tuicool.com/m/articles/R3MN7vz
      • 4e98088a4bd8:好,继续努力
        夏天然后:@小杰杰0521 :joy::joy::joy:
      • 没骆驼de祥子:Dmeo? :smile:
        夏天然后:@没骆驼de祥子 没写呢😉

      本文标题:iOS UICollectionView那些我"错过&

      本文链接:https://www.haomeiwen.com/subject/bitosttx.html