前言: 这是博主在学习旧知识笔记中的一篇, 谁叫咱入门晚呢, 学习的过程中, 不会的知识, 就是因为我们年轻而已(囧~) 我总是这样安慰自己(逃~), 所以我们需要补充一下”错过”的重要的东西, 下面列出了本文会提到的一些概念. 如不感兴趣直接退出即可
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
1
2
3
4
5
6
7
8
|
// 多少个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.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
// 系统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然后需要重写以下几个方法:
1
2
3
4
5
6
7
8
9
10
11
12
|
// 返回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实例化之后, 有一些方法将自动被调用
1
2
3
4
|
// 一般在该方法中设定一些必要的layout的结构和初始需要的参数
-
(
void
)
prepareLayout
// 处置collection应该占据的尺寸(所有内容所占的尺寸) collectionView的本质是一个scrollView, 需要滚动尺寸
-
(
CGSize
)
collectionViewContentSize
|
需要更新layout时, 调用这个方法 有点UIView的setNeedsLayout的意思…
1
|
-
invalidateLayout
|
说了这么多, 我觉得我理解的更深一点了, 你呢?
说的再多不如show you my demo 稍后有时间补上… [大笑.png]
这里是官方的一个Dmeohttps://github.com/mpospese/CircleLayout.git