之前用CollectionViewController只是皮毛,一些iOS從入門到精通的書上也是泛泛而談。這幾天好好的搞了搞蘋果的開發文檔上CollectionViewController的內容,親身體驗了一下CollectionViewController的強大,之前一直認為CollectionView和TableView用法差不多,功能應該也是類似的。TableView的功能就已經很強大了,,CollectionView就是TableView的升級版,其功能更為強大。以后的幾篇博客中好好的研究一下CollectionView,由淺入深,層層深入,搞透CollectionView這個強大的組件。在一些開源社區上分享的效果比較炫的代碼,有不少是使用UICollectionView做的,UICollectionViewController是很實用的,很有必要好好的搞一下。
一. CollectionViewController簡介
UICollectionViewController說白了就是一個UIViewController + UICollectionView = UICollectionViewController。 這一點和UITableViewController是一樣一樣的。
1.繼承關系
由上圖可知,UICollectionViewController的父親(父類)是UIViewController, 而UIViewController的父親是UIResponder,UIResponder繼承自NSObject。這個繼承關系和UITableViewController是一樣一樣的, 也就是說UICollectionViewController和UITableViewController是兄弟或者姐妹關系。這樣比的話他倆就親近多了。
2.遵循的一些協議
這些協議也和UITableViewController遵循的協議類似,常用的還是UICollectionViewDataSource(數據源)和UICollectionViewDelegate(委托代理), 上面這兩個常用的協議就不多說了和UITableViewController的用法類似。
UITraitEnvironment 是iOS8以后才引入的新的協議接口,它和Size Class有關,這個類封裝了像水平和豎直方向的Size Class等信息,iOS8的UIKit中大多數UI的基礎類(包括UIScreen, UIWindow, UIViewController, UIPresentationController 和 UIView)都實現了UITraitEnvironment
這個接口,可以通過這個接口來做一些控件顯示,屏幕適配等一些工作。
UIContentContainer 是iOS8之后添加的新的協議,也是和Size Class相關的協議。該協議中的方法可以幫助你適配視圖控制器上的內容,比如內容尺寸和位置等。
UIViewController 和 UIPresentationController(iOS8的新特性,在這兒不做過多介紹)’象為該協議提供默認的實現方法。當創建自定義視圖控制器或者展示控制器時,你可以重寫默認的實現方法來調整你視圖控制器的內容。例如,你可以使用該方法來調整子視圖控制器的大小或位置。
由上面可知UICollectionViewController是iOS6以后推出的東西,相對起來還是比較新的。
二. UICollectionViewController的實現行為
-
1. 如果你的集合視圖控制器與nib文件或者Storyboard進行了綁定,那么他的視圖將會從nib文件或者Storybaord中進行加載。如果你是使用編程的方式來創建集合視圖控制器,那么將會自動創建一個已經配置好的collection view, 而這個collection view可以通過 collectionView來進行訪問。
-
2.當從nib文件或者Storyboard中加載集合視圖時,集合視圖的數據源(Data source)和代理對象(Delegate Object)是從nib或者Storyboard中獲取的。如果data source 或者 delegate沒有被指定的話,collection view將會自動賦值一個未知的對象。
-
3.當集合視圖首次出現時會重新加載上面的數據。當視圖每次顯示時,也會清除當前的選擇。不過你可以把屬性 clearsSelectionOnViewWillAppear設置成NO來改變這種行為。
你可以創建一個自定義的UICollectionViewController子類來管理你的集合視圖。當你初始化視圖控制器時,你可以使用initWithCollectionViewLayout:方法來指定集合視圖想要使用的布局方式。因為剛創建集合視圖是沒有尺寸或者內容的,data source和delegate是一個典型集合視圖中所必須的信息。
你可以重寫loadView或者其他超類中的方法,但是如果你這樣做, 你必須確保在你實現的方法中使用super調用了超類中相應的方法。如果你沒有這么做,集合控制器有可能沒有執行所有需要執行的任務來保證集合視圖的完整。
三.簡單集合視圖控制器創建
1.初始化UICollectionViewController對象
使用initWithCollectionViewLayout: 方法來初始化UICollectionViewController的對象,該方法可以初始化和根據提供的布局來配置集合視圖。布局會控制集合視圖上的單元格(Cell)的排列方式。默認的是Flow Layout.
2. 使用Storyboard創建一個CollectionViewController
(1) 從控件庫中拖拽出Collection View Controller ,你可以在Cell上添加一個ImageView, 並且添加上圖片,這樣看起來也漂亮一些。你也可以給Cell設置一個背景色便於區分。
(2) 設定Cell的默認寬高,具體如下圖所示
(3) 設定Cell的重用標示符為"Cell"這個我們要在代碼中使用
(4) 給集合視圖控制器關聯代碼,並設置Storyboard ID
3.在代碼中實現相應的代理,和TableView非常類似
(1) 返回Section個數的方法
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView { return 1; }
(2) 返回每個Section中Cell個數的方法
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { return 30; }
(3) 通過Cell重用標示符來選擇和重用Cell
1 - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { 2 UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath]; 3 4 // Configure the cell 5 6 return cell; 7 }
通過上面的步驟一個簡單CollectionView就可以運行起來了,最終運行效果如下所示:
今天這篇博客的內容算開個頭,后邊回由淺入深,慢慢更新博客。今天就是一個Ready的過程,下篇博客將會基於今天這個工程介紹其他的關於UICollectionView的東西,如UICollectionViewLayout等,來逐漸領略UICollectionViewController的魅力。