UICollectionview

UICollectionView

类似于UItableView继承自UIScrollView. 区别在于:UICollectionView有其独特的布局特性.
UICollectionview_第1张图片

如图,可以看出组成

  1. cells: 用于展示主体内容,尺寸可以各不相同.
  2. Supplementary Views : 追加视图,类似于UITableView的每个Section的Header/Footer View.
  3. Decoration Views: 装饰视图,跟数据没有关系,只负责给上面两个添加辅助视图.

与Tableview使用的异同:

必须先提供一个布局: UICollectionViewLayout 对象, 该对象定义了CollectionView的独特布局.

DataSource:

  • section数量:numberOfSectionInCollectionView:
  • 某个section中的多少个item: collectionView:numberOfItemsInSection:
  • 某个section显示什么样的SupplementaryView: collectionView:viewForSupplementaryElementOfKind:atIndexPath:

  • 显示什么样的Cell: collectionView:cellForItemAtIndexPath:

而Decoration Views的显示方法不再DataSource中,而是在UICollectionViewLayout中.(应为跟数据无关)

重用机制

类似于Tableview,CollectionView也有重用机制. 不同点在于, 它会重用包括cell和Supplementary以及Decoration 三个组成部分.
因为UICollectionViewCell继承自UICollectionReusableView.而SupplementaryView和Decoration也是继承于此的.

注册自定义视图:
registerClass:forCellWithReuseIdentifier:
registerClass:forSupplementaryViewOfKind:withReuseIdentifier

出列
dequeueReusableCellWithReuseIdentifier:forIndexPath
dequeueReusableSupplementaryViewOfKind:withReuseIdentifier:forIndexPath

SupplementaryViewOfKind:参数是字符串常量文UICollectionElementKindSectionHeader/UICollectionElementKindSectionFooter.

Delegate

负责与数据无关的View的外形,用户交互等.

  • cell高亮, 选中状态等
  • 支持长按后的菜单
  • 用户的交互部分: 每个cell都有独立的高亮,选中事件的delegate. 点击一个cell时,会按以下流程delegate访问;
    1. collectionView:shouldHighlightItemAtIndexPath: 是否允许高亮
    2. collectionView:didHighItemAtIndexPath: 高亮时做什么
    3. collectionView:shouldSelectItemAtIndexPath: or -collectionView:shouldDeselectItemAtIndexPath:是否可选
    4. -collectionView:didSelectItemAtIndexPath: or -collectionView:didDeselectItemAtIndexPath:(多选模式时) 选中时做什么
    5. -collectionView:didUnhighlightItemAtIndexPath:取消高亮时做什么

UICollectionCell

相对于UItableViewCell,UICollectionViewCell没有那么多样式. 不存在style,也没有内置的label和iamgeView.

结构

  • Cell: 就是一个view,UICollectionReusableView类.
  • backgroundView :cell的背景视图.
  • selectedBackgroundView:被选中时背景视图
  • contentView: 同tableview.

细节: 当cell被选中时,所有cell中的子View,会自动查找自己是否有被选中状态下的改变,如果有,自动改变;

UICollectionViewLayout布局

是CollectionView特有的, 它负责每个cell,supplementary,decoration 进行组合,设置各自的位置-大小-透明度-层级关系-形状等.

属性:

  • CGSize itemSize: 定义了每个cell item的大小,如果想设置不同的size, 你可以通过 collectionView:layout:sizeForItemAtIndexPath设置.
  • CGFloat minimumLineSpacing:最小行间隔. 同样可通过collectionView:minimumxx
    设置不同的间隔.
  • sectionInset 组内边距 , 同样 insetForSectionAtIndex:个性设置
  • headerReferenceSize supplementary head大小; referenceSizeForHeaderInSection:个性大小
  • footerReferenceSize 同上
  • scrollDirection collectionView设置滚动方向.

方法:

//1. 准备布局,一般在这里进行布局初始化
- (void)prepareLayout;  //每当collectionView变价改变时就会调用这个方法,询问 是否重新初始化布局.
- (BOOL)ShouldinvalidateLayoutForBoundsChange:(CGRect)newBounds;  //2. 初始化布局时调用. 返回 在一定区域内,每个cell和Supp及Decora的布局属性.
-layoutAttributesForElementsInRect:  //当滚动停止时, 会调用该方法确定collectionVIew滚动的位置.
- targetContentOffsetForProposedContentOffset: withScrollingVelocity:

使用这四个方法可以设计特别的效果,例如当一个cell滑动到屏幕中点时放大,自动居中最近的cell.

UICollectionViewLayoutAttributes布局属性
UICollectionVIewLayout布局时,会根据屏幕所处位置,得到一个UICollectionViewLAyoutAttributes,描述了 三个视图的size,center等.

  • frame,center ,size, transform, alpha
  • transform3D: 可以用来做3D动画.
  • zIndex: 视图层级,
  • index path: cell对应的indexPath
  • representedEelmentCategory: 视图标记– 区分是cell,supple还是decoration
  • registerClass:forDecorationViewOfKind: 注册重用decoration View
  • +(instancetype)layoutAttributesForDecorationViewOfKind:(NSString )decorationViewKind withIndexPath:(NSIndexPath )indexPath 这个类方法是decoration View布局的来源
  • +(nullable UICollectionViewLayoutAttributes )layoutAttributesForDecorationViewOfKind:(NSString )elementKind atIndexPath:(NSIndexPath *)indexPath 与上一个方法结合得到decoration View布局

自定义布局

完全的自定义布局十分麻烦,所以一般只使用苹果提供的一些特定方法进行修改: 例如删除插入移动item布局.

  • @interface UICollectionViewLayout (UISubclassingHooks) 这个扩展类中,都是用来布局UIcollectionView子视图的. – 用于基本布局
  • @interface UICollectionViewLayout (UIUpdateSupportHooks) 用来布局删除插入动作
  • @interface UICollectionViewLayout (UIReorderingSupportHooks) 移动动作布局

删除或插入item:

[self.collectionView performBatchUpdates:^{
    [self.collectionView deleteItemsAtIndexPaths:@[pinchIndexPath]];
} completion:nil];
[self.collectionView performBatchUpdates:^{
    [self.collectionView insertItemsAtIndexPaths:@[[NSIndexPath indexPathForItem:0 inSection:0]]];
} completion:nil];

你可能感兴趣的:(UICollectionview)