之前用CollectionViewController只是皮毛椅邓,一些iOS從入門到精通的書上也是泛泛而談悠瞬。這幾天好好的搞了搞蘋果的開發(fā)文檔上CollectionViewController的內(nèi)容斧吐,親身體驗(yàn)了一下CollectionViewController的強(qiáng)大蔗蹋,之前一直認(rèn)為CollectionView和TableView用法差不多锨天,功能應(yīng)該也是類似的菊卷。TableView的功能就已經(jīng)很強(qiáng)大了,宝剖,CollectionView就是TableView的升級版洁闰,其功能更為強(qiáng)大。以后的幾篇博客中好好的研究一下CollectionView万细,由淺入深渴庆,層層深入,搞透CollectionView這個強(qiáng)大的組件雅镊。在一些開源社區(qū)上分享的效果比較炫的代碼,有不少是使用UICollectionView做的刃滓,UICollectionViewController是很實(shí)用的仁烹,很有必要好好的搞一下。
一. CollectionViewController簡介
UICollectionViewController說白了就是一個UIViewController + UICollectionView = UICollectionViewController咧虎。 這一點(diǎn)和UITableViewController是一樣一樣的卓缰。
1.繼承關(guān)系
由上圖可知,UICollectionViewController的父親(父類)是UIViewController, 而UIViewController的父親是UIResponder砰诵,UIResponder繼承自NSObject征唬。這個繼承關(guān)系和UITableViewController是一樣一樣的, 也就是說UICollectionViewController和UITableViewController是兄弟或者姐妹關(guān)系茁彭。這樣比的話他倆就親近多了总寒。
2.遵循的一些協(xié)議
這些協(xié)議也和UITableViewController遵循的協(xié)議類似,常用的還是UICollectionViewDataSource(數(shù)據(jù)源)和UICollectionViewDelegate(委托代理), 上面這兩個常用的協(xié)議就不多說了和UITableViewController的用法類似理肺。
UITraitEnvironment 是iOS8以后才引入的新的協(xié)議接口摄闸,它和Size Class有關(guān),這個類封裝了像水平和豎直方向的Size Class等信息妹萨,iOS8的UIKit中大多數(shù)UI的基礎(chǔ)類(包括UIScreen, UIWindow, UIViewController, UIPresentationController 和 UIView)都實(shí)現(xiàn)了UITraitEnvironment
這個接口年枕,可以通過這個接口來做一些控件顯示,屏幕適配等一些工作乎完。
UIContentContainer 是iOS8之后添加的新的協(xié)議熏兄,也是和Size Class相關(guān)的協(xié)議。該協(xié)議中的方法可以幫助你適配視圖控制器上的內(nèi)容树姨,比如內(nèi)容尺寸和位置等摩桶。
UIViewController 和 UIPresentationController(iOS8的新特性,在這兒不做過多介紹)’象為該協(xié)議提供默認(rèn)的實(shí)現(xiàn)方法帽揪。當(dāng)創(chuàng)建自定義視圖控制器或者展示控制器時典格,你可以重寫默認(rèn)的實(shí)現(xiàn)方法來調(diào)整你視圖控制器的內(nèi)容。例如台丛,你可以使用該方法來調(diào)整子視圖控制器的大小或位置耍缴。
- 由上面可知UICollectionViewController是iOS6以后推出的東西砾肺,相對起來還是比較新的。
二. UICollectionViewController的實(shí)現(xiàn)行為 -
如果你的集合視圖控制器與nib文件或者Storyboard進(jìn)行了綁定防嗡,那么他的視圖將會從nib文件或者Storybaord中進(jìn)行加載变汪。如果你是使用編程的方式來創(chuàng)建集合視圖控制器,那么將會自動創(chuàng)建一個已經(jīng)配置好的collection view, 而這個collection view可以通過collectionView來進(jìn)行訪問蚁趁。
2.當(dāng)從nib文件或者Storyboard中加載集合視圖時裙盾,集合視圖的數(shù)據(jù)源(Data source)和代理對象(Delegate Object)是從nib或者Storyboard中獲取的。如果data source 或者 delegate沒有被指定的話他嫡,collection view將會自動賦值一個未知的對象番官。
3.當(dāng)集合視圖首次出現(xiàn)時會重新加載上面的數(shù)據(jù)。當(dāng)視圖每次顯示時钢属,也會清除當(dāng)前的選擇徘熔。不過你可以把屬性clearsSelectionOnViewWillAppear設(shè)置成NO來改變這種行為。
你可以創(chuàng)建一個自定義的UICollectionViewController子類來管理你的集合視圖淆党。當(dāng)你初始化視圖控制器時酷师,你可以使用initWithCollectionViewLayout:方法來指定集合視圖想要使用的布局方式。因?yàn)閯倓?chuàng)建集合視圖是沒有尺寸或者內(nèi)容的染乌,data source和delegate是一個典型集合視圖中所必須的信息山孔。
你可以重寫loadView或者其他超類中的方法,但是如果你這樣做, 你必須確保在你實(shí)現(xiàn)的方法中使用super調(diào)用了超類中相應(yīng)的方法荷憋。如果你沒有這么做台颠,集合控制器有可能沒有執(zhí)行所有需要執(zhí)行的任務(wù)來保證集合視圖的完整。
三.簡單集合視圖控制器創(chuàng)建
1.初始化UICollectionViewController對象
使用initWithCollectionViewLayout: 方法來初始化UICollectionViewController的對象勒庄,該方法可以初始化和根據(jù)提供的布局來配置集合視圖蓉媳。布局會控制集合視圖上的單元格(Cell)的排列方式。默認(rèn)的是Flow Layout.
-
使用Storyboard創(chuàng)建一個CollectionViewController
(1) 從控件庫中拖拽出Collection View Controller 锅铅,你可以在Cell上添加一個ImageView, 并且添加上圖片酪呻,這樣看起來也漂亮一些。你也可以給Cell設(shè)置一個背景色便于區(qū)分盐须。
(2) 設(shè)定Cell的默認(rèn)寬高玩荠,具體如下圖所示
(3) 設(shè)定Cell的重用標(biāo)示符為”Cell”這個我們要在代碼中使用
(4) 給集合視圖控制器關(guān)聯(lián)代碼,并設(shè)置Storyboard ID
3.在代碼中實(shí)現(xiàn)相應(yīng)的代理,和TableView非常類似
(1) 返回Section個數(shù)的方法
Objective-C
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
return 1;
}
(2) 返回每個Section中Cell個數(shù)的方法
Objective-C
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
return 30;
}
(3) 通過Cell重用標(biāo)示符來選擇和重用Cell
Objective-C
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath];
// Configure the cell
return cell;
}
通過上面的步驟一個簡單CollectionView就可以運(yùn)行起來了贼邓,最終運(yùn)行效果如下所示:
今天這篇博客的內(nèi)容算開個頭阶冈,后邊回由淺入深,慢慢更新博客塑径。今天就是一個Ready的過程女坑,下篇博客將會基于今天這個工程介紹其他的關(guān)于UICollectionView的東西,如UICollectionViewLayout等统舀,來逐漸領(lǐng)略UICollectionViewController的魅力匆骗。
如果您是iOS開發(fā)者劳景,或者對本篇文章感興趣,請關(guān)注本人碉就,后續(xù)會更新更多相關(guān)文章盟广!敬請期待!
參考文章:
iOS開發(fā)之窺探UICollectionViewController(一) -- Ready Your CollectionViewController