UICollectionView簡介
UICollectionView是iOS6添加的一個控件夜畴,是一種新的數(shù)據(jù)展示方式吮炕,簡單來說可以把他理解成多列的UITableView,最簡單的UICollectionView就是一個GridView钱床,可以以多列的方式將數(shù)據(jù)進行展示。
標準的UICollectionView包含三個部分惩猫,它們都是UIView的子類:
Cells 用于展示內(nèi)容的主體,對于不同的cell可以指定不同尺寸和不同的內(nèi)容
Supplementary Views 追加視圖蚜点,可以理解為每個Section的Header或者Footer轧房,用來標記每個section的view
Decoration Views 裝飾視圖 這是每個section的背景
實現(xiàn)一個簡單的UICollectionView
實現(xiàn)一個UICollectionView和實現(xiàn)一個UITableView基本沒有什么大區(qū)別,它們都同樣是datasource+delegate
基本的UICollectionViewDataSource提供
<pre><code>
-numberOfSectionsInCollection: //section的數(shù)量
-collectionView:numberOfItemsInSection: //某個section里有多少個item
-collectionView:cellForItemAtIndexPath: // 對于某個位置應(yīng)該顯示什么樣的cell
-collectionView:viewForSupplementaryElementOfKind:atIndexPath: //提供Supplementary View
</code></pre>
與UITableView中的情況一致绍绘,UICollectionView也需要對Cell進行重用奶镶,在iOS5中,Apple對UITableView的重用做了簡化陪拘,以往要寫類似這樣的代碼:
<pre><code>
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MY_CELL_ID"];
if (!cell) {
cell = [[UITableViewCell alloc] init];
}
//配置cell厂镇,blablabla
return cell
</code></pre>
在iOS5以后如果我們在TableView向數(shù)據(jù)源請求數(shù)據(jù)之前使用-registerNib:forCellReuseIdentifier:方法為@“MYCELLID"注冊過nib的話,就可以省下每次判斷并初始化cell的代碼左刽,要是在重用隊列里沒有可用的cell的話捺信,runtime將自動幫我們生成并初始化一個可用的cell,還有以下類似方法
<pre><code>
(void)registerNib:(UINib *)nib forCellReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(5_0);
(void)registerClass:(Class)cellClass forCellReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(6_0);
(void)registerNib:(UINib *)nib forHeaderFooterViewReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(6_0);
(void)registerClass:(Class)aClass forHeaderFooterViewReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(6_0);
</code></pre>
同樣的 UICollectionView也有類似的方法
<pre><code>
(void)registerClass:(Class)cellClass forCellWithReuseIdentifier:(NSString *)identifier;
(void)registerNib:(UINib *)nib forCellWithReuseIdentifier:(NSString *)identifier;
(void)registerClass:(Class)viewClass forSupplementaryViewOfKind:(NSString *)elementKind withReuseIdentifier:(NSString *)identifier;
(void)registerNib:(UINib *)nib forSupplementaryViewOfKind:(NSString *)kind withReuseIdentifier:(NSString *)identifier;
</code></pre>
基本的UICollectionViewDelegate提供與數(shù)據(jù)無關(guān)的view的外形欠痴,用戶交互之類:
cell的高亮
cell的選中狀態(tài)
可以支持長按后的菜單
關(guān)于用戶交互迄靠,UICollectionView也做了改進。每個cell現(xiàn)在有獨立的高亮事件和選中事件的delegate喇辽,用戶點擊cell的時候掌挚,現(xiàn)在會按照以下流程向delegate進行詢問:
<pre><code>
-collectionView:shouldHighlightItemAtIndexPath: // 是否應(yīng)該高亮?
-collectionView:didHighlightItemAtIndexPath: //如果1答是菩咨,那么高亮
-collectionView:shouldSelectItemAtIndexPath: //無論1結(jié)果如何吠式,都詢問是否可以被選中?
-collectionView:didUnhighlightItemAtIndexPath: // 如果1答是抽米,那么現(xiàn)在取消高亮
-collectionView:didSelectItemAtIndexPath: // 如果3答是奇徒,那么選中cell
</code></pre>
Cell
UICollectionViewCell結(jié)構(gòu)比較簡單, 由上至下
首先是cell本身作為容器view
然后是一個大小自動適應(yīng)整個cell的backgroundView缨硝,用作cell平時的背景
再其上是selectedBackgroundView,是cell被選中時的背景
最后是一個contentView罢低,自定義內(nèi)容應(yīng)被加在這個view上
UICollectionViewLayout
這是UICollectionView和UITableView最大的不同查辩。UICollectionViewLayout負責了將各個cell、Supplementary View和Decoration Views進行組織网持,為它們設(shè)定各自的屬性宜岛。在展示之前,一般需要生成合適的UICollectionViewLayout子類對象功舀,并將其賦予CollectionView的collectionViewLayout屬性萍倡。
SDK為我們提供了一個最簡單可能也是最常用的默認layout對象,UICollectionViewFlowLayout辟汰。Flow Layout簡單說是一個直線對齊的layout列敲,最常見的Grid View形式即為一種Flow Layout配置:
首先一個重要的屬性是itemSize阱佛,它定義了每一個item的大小。通過設(shè)定itemSize可以全局地改變所有cell的尺寸戴而,如果想要對某個cell制定尺寸凑术,可以使用-collectionView:layout:sizeForItemAtIndexPath:方法。
間隔 可以指定item之間的間隔和每一行之間的間隔所意,和size類似淮逊,有全局屬性,也可以對每一個item和每一個section做出設(shè)定:
<pre><code>
@property (CGSize) minimumInteritemSpacing
@property (CGSize) minimumLineSpacing
-collectionView:layout:minimumInteritemSpacingForSectionAtIndex:
-collectionView:layout:minimumLineSpacingForSectionAtIndex:
</code></pre>
滾動方向 由屬性scrollDirection確定scroll view的方向扶踊,將影響Flow Layout的基本方向和由header及footer確定的section之間的寬度
UICollectionViewScrollDirectionVertical
UICollectionViewScrollDirectionHorizontal
Header和Footer尺寸 同樣地分為全局和部分泄鹏。需要注意根據(jù)滾動方向不同,header和footer的高和寬中只有一個會起作用秧耗。垂直滾動時section間寬度為該尺寸的高备籽,而水平滾動時為寬度起作用,如圖绣版。
<pre><code>
@property (CGSize) headerReferenceSize
@property (CGSize) footerReferenceSize
-collectionView:layout:referenceSizeForHeaderInSection:
-collectionView:layout:referenceSizeForFooterInSection:
</code></pre>
縮進
<pre><code>
@property UIEdgeInsets sectionInset;
-collectionView:layout:insetForSectionAtIndex:
</code></pre>
通過自定義Layout可以實現(xiàn)各種nb布局胶台,基本上常見的類似的第三方開源控件效果都可以實現(xiàn),比如瀑布流杂抽、coverFlow诈唬,下面實現(xiàn)一個基本的瀑流效果