1. 程式人生 > >iOS開發之窺探UICollectionViewController(二) :詳解CollectionView各種回撥

iOS開發之窺探UICollectionViewController(二) :詳解CollectionView各種回撥

UICollectionView的佈局是可以自己定義的,在這篇部落格中先在上篇部落格的基礎上進行擴充,我們先使用UICollectionViewFlowLayout,然後好好的介紹一下UICollectionView的一些回撥方法,主要包括UICollectionViewDataSource,UICollectionViewDelegateFlowLayout,UICollectionViewDelegate相關回調方法,並通過例項來介紹每個回撥的用法。並且給每個Section新增定製的Header和Footer,好廢話少說進入今天的正題。

一、Demo總覽

下圖是本篇部落格中Demo的最終執行效果,下面是我們要做的事情:

1. 給每個Section新增自定義的重用Header和Footer

2.調整第一個Section的上左下右的邊距(UIEdgeInsets

3.給UICollectioinView設定多選

4.處理Cell的高亮事件

5.處理Cell的選中事件

6.調整Cell的上下左右邊距

7.對Cell進行編輯

二、UICollectionViewDataSource介紹

1、在UICollectionViewDataSource回撥方法中有一個返回Section數量的方法,如下所示,該方法和UITableView中的用法一致。在這兒我們返回5個Section,如下所示:

Objective-C
12345678 #pragma mark /**  * 返回Section的個數  */-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView
*)collectionView{return5;}

2、在UICollectionViewDataSource的回撥方法中,還有一個是返回每個Section中Cell的數量的方法,在這我們返回30個Cell, 如下程式碼所示:

Objective-C
12345678 /**  * 返回每個Section中Cell的個數  */-(NSInteger)collectionView:(UICollectionView*)collectionView      numberOfItemsInSection:(NSInteger)section{return30;}

3、在UICollectionViewDataSource還有一個必須實現的方法, 就是選擇我們CollectionView中所使用的Cell, 在這裡我們所使用的Cell是在Storyboard上實現的,所以不需要在我們的程式碼中註冊Cell, 之間使用重用標示符就可以獲取Cell的物件,如下所示:

Objective-C
123456789101112 /**   * 返回Cell種類   */-(UICollectionViewCell*)collectionView:(UICollectionView*)collectionView                    cellForItemAtIndexPath:(NSIndexPath*)indexPath{//通過Cell重用標示符來獲取CellCollectionViewCell*cell=[collectionView dequeueReusableCellWithReuseIdentifier: reuseIdentifier                                                                           forIndexPath: indexPath];returncell;}

4、在UICollectionViewDataSource方法中有一個可選的方法就是為我們的Section新增Supplementary View(追加檢視),下面是添Supplementary View(追加檢視)的步驟。在UICollectionView中的Section中我們可以為其增加Header View和Footer View, 也就是官方文件上提到的Supplementary View(追加檢視)。追加檢視是可以重用的,也就是UICollectionReusableView。我們可以建立兩個UICollectionReusableView的子類,一個是Header View, 另一個是Footer View。

(1)建立UICollectionReusableView

追加檢視可以在Storyboard上新增,然後設定重用標示符,在程式碼中使用即可。這裡我們是從xib檔案來載入的Supplementary View, 先建立兩個UICollectionReusableView子類,在建立該子類的同時建立相應的xib檔案,如下所示:

建立Header View和Footer View的UICollectionReusableView,建立後的檔案目錄如下:

(2) 因為我們是從xib檔案中載入的UICollectionReusableView,所以需要在相應的UICollectionView上進行註冊。如果你是使用的Storyboard, 只需要在Storyboard中指定重用標示符即可。下面的程式碼就是在ViewDidLoad中呼叫註冊UICollectionReusableView的方法。

Objective-C
123456789101112131415161718192021222324 /**   * 註冊Header和FooterView   * 便於在UICollectionViewDataSource中使用   */-(void)registerHeaderAndFooterView{//註冊headerView//獲取含有UICollectionReusableView的Nib檔案。UINib*headerNib=[UINib nibWithNibName:@"CollectionHeaderReusableView"                                        bundle:[NSBundlemainBundle]];//註冊重用View[self.collectionView registerNib: headerNib           forSupplementaryViewOfKind: UICollectionElementKindSectionHeader                  withReuseIdentifier:@"CollectionHeaderReusableView"];//註冊FooterViewUINib*footerNib=[UINib nibWithNibName:@"CollectionFooterReusableView"                                       bundle:[NSBundlemainBundle]];[self.collectionView registerNib: footerNib           forSupplementaryViewOfKind: UICollectionElementKindSectionFooter                  withReuseIdentifier:@"CollectionFooterReusableView"];}

(3)在UICollectionViewDataSource中的設定Supplementary View的方法中通過Header View和Footer View的重用標示符來為我們的Section設定Supplementary View,具體程式碼如下所示:

Objective-C
1234567891011121314151617181920 /**   * 設定Setion的Header和Footer(Supplementary View)   */-(UICollectionReusableView*)collectionView:(UICollectionView*)collectionView             viewForSupplementaryElementOfKind:(NSString*)kind                                   atIndexPath:(NSIndexPath*)indexPath{//設定SectionHeaderif([kind isEqualToString: UICollectionElementKindSectionHeader]){UICollectionReusableView*view=[collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"CollectionHeaderReusableView" forIndexPath:indexPath];returnview;}//設定SectionFooterUICollectionReusableView*view=[collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionFooter withReuseIdentifier:@"CollectionFooterReusableView" forIndexPath:indexPath];returnview;}

UICollectionViewDataSource中的四個方法在上面都進行了實現,UICollectionViewDataSource主要是負責載入資料來源的,包括Section的個數,每個Section中Cell的個數,每個Section中Supplementary View的種類。

三.UICollectionViewDelegateFlowLayout回撥實現

UICollectionViewDelegateFlowLayout主要是負責顯示的,比如Secion的大小、邊距,Cell的大小邊距,headerView的大小已經FooterView的大小,都是在UICollectionViewDelegateFlowLayout的相應協議的方法來實現的。接下來詳細的介紹一下UICollectionViewDelegateFlowLayout協議中的方法。

1.同一個Section中同一種Cell(通過同一個Cell重用標示符獲取的物件)可以有不同的尺寸,下面的程式碼是給Cell定製尺寸。程式碼的具體意思是第一個Section中的所有Cell的尺寸是(50,50)。 其餘的時(60,60)。

Objective-C
1234567891011121314 #pragma mark  /**   * 改變Cell的尺寸   */-(CGSize)collectionView:(UICollectionView*)collectionView                    layout:(UICollectionViewLayout*)collectionViewLayout    sizeForItemAtIndexPath:(NSIndexPath*)indexPath{if(indexPath.section==0){returnCGSizeMake(50,50);}returnCGSizeMake(60,60);}

2.改變Section的上下左右邊距–UIEdgeInsetsMake(, , , ),逆時針旋轉。第一個Section的上左下右的邊距都是50, 其餘的Section上左下右的邊距是0。具體實現看如下程式碼:

Objective-C
123456789101112 /**   * Section的上下左右邊距--UIEdgeInsetsMake(上, 左, 下, 右);逆時針   */-(UIEdgeInsets)collectionView:(UICollectionView*)collectionView                          layout:(UICollectionViewLayout*)collectionViewLayout          insetForSectionAtIndex:(NSInteger)section{if(section==0){returnUIEdgeInsetsMake(50,50,50,50);}returnUIEdgeInsetsMake(0,0,0,0);}

3.設定每個Cell的上下邊距的回撥如下所示,第一個Section的Cell上下邊距是5.0f, 其餘的為20.0f。

Objective-C
1234567891011 /**   * Section中每個Cell的上下邊距   */-(CGFloat)collectionView:(UICollectionView*)collectionView                     layout:(UICollectionViewLayout*)collectionViewLayout  minimumLineSpacingForSectionAtIndex:(NSInteger)section{if(section==0){return5.0f;}return20.0f;}

4.設定Cell的左右邊距,第一個Section的Cell左右邊距是5.0f, 其餘的為20.0f。

Objective-C
1234567891011 /**   * Section中每個Cell的左右邊距   */-(CGFloat)collectionView:(UICollectionView*)collectionView                     layout:(UICollectionViewLayout*)collectionViewLayout  minimumInteritemSpacingForSectionAtIndex:(NSInteger)section{if(section==0){return5.0f;}return20.0f;}

5.設定Header View和Footer View的大小的回撥如下。

Objective-C
1234567891011121314151617 /**   * headerView的大小   */-(CGSize)collectionView:(UICollectionView*)collectionView                    layout:(UICollectionViewLayout*)collectionViewLayout  referenceSizeForHeaderInSection:(NSInteger)section{returnCGSizeMake(200,50);}/**  * footerView的大小  */-(CGSize)collectionView:(UICollectionView*)collectionView                   layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForFooterInSection:(NSInteger)section{

相關推薦

iOS開發窺探UICollectionViewController() CollectionView各種

UICollectionView的佈局是可以自己定義的,在這篇部落格中先在上篇部落格的基礎上進行擴充,我們先使用UICollectionViewFlowLayout,然後好好的介紹一下UICollectionView的一些回撥方法,主要包括UICollectionViewDat

iOS開發窺探UICollectionViewController(三) 使用UICollectionView自定義瀑布流

上篇部落格的例項是自帶的UICollectionViewDelegateFlowLayout佈局基礎上來做的Demo, 詳情請看《iOS開發之窺探UICollectionViewController(二) –詳解CollectionView各種回撥》。UICollectionV

iOS開發窺探UICollectionViewController(五)一款炫酷的圖片瀏覽元件

本篇部落格應該算的上CollectionView的高階應用了,從到今天的(五),可謂是由淺入深的窺探了一下UICollectionView的用法,這些用法不僅包括SDK中自帶的流式佈局(UICollectionViewDelegateFlowLayout)而且介紹瞭如何根據你的

iOS開發窺探UICollectionViewController(一) Ready Your CollectionViewController

之前用CollectionViewController只是皮毛,一些iOS從入門到精通的書上也是泛泛而談。這幾天好好的搞了搞蘋果的開發文件上CollectionViewController的內容,親身體驗了一下CollectionViewController的強大,之前一直認為

iOS開發窺探UICollectionViewController(四) --一款功能強大的自定義瀑布流

在上一篇部落格中,自定義瀑布流的列數,Cell的外邊距,Cell的最大以及最小高度是在我們的佈局檔案中是寫死的,換句話說也就是不可配置的。為了循序漸進,由淺入深呢,上篇部落格暫且那麼寫。不過那樣寫太過死板,本來使用起來比較靈活的自定義佈局,如果把其配置引數給寫死了,就相當於在籠

iOS 開發 Object-C和JavaScript互動OC與JS互動在WKWebView中使用

1.OC與JS互動在UIWebView中使用 2. WKWebView的使用詳解 3.OC與JS互動在WKWebView中使用 // // ViewController.m // oc與js互動WKWebView // // Cr

芒果iOS開發記憶體管理

/********** OC第十講記憶體管理 **********/ 主要內容  1.屬性的內部實現原理  2.dealloc內釋放例項變數  3.便利構造器方法的實現原理  4.collection的記憶體管理 /******* 1.屬性的內部實現原理 

iOS筆記UIButton的UIEdgeInsetsMake使用

1、UIEdgeInsetsMake介紹 首先簡單介紹一下UIEdgeInsetsMake 引用:UIEdgeInsetsMake使用詳解的圖片和講解,再加上自己的理解與實現 先看定義 typedef struct UIEdgeInsets { CGFloat top

Android開發基本控制元件和四種佈局方式

Android中的控制元件的使用方式和iOS中控制元件的使用方式基本相同,都是事件驅動。給控制元件新增事件也有介面回撥和委託代理的方式。今天這篇部落格就總結一下Android中常用的基本控制元件以及佈局方式。說到佈局方式Android和iOS還是區別挺大的,在iOS中有F

android開發wheel控制元件使用

出門在外生不起病呀,隨便兩盒藥60多塊錢。好吧,不廢話了,今天我們來看看wheel控制元件的使用,這是GitHub上的一個開源控制元件,用起來十分方便,我們可以用它做許多事情,比如做一個自定義的datepicker,在一些電商App中,經常用它來做省市縣三級聯動,總之用途還是

機器學習演算法Boosting系列演算法一Adaboost

本文主要介紹boosting演算法得基本原理,以及的三種典型演算法原理:adaboost,GBM(Gradient bossting machine),XGBoost。 Boosting方法原理 boosting演算法是一類將弱學習器提升為強學習器的整合學習

Android開發WebView和JS互動

Android提供了一個很強大的WebView控制元件用來處理Web網頁,而在網頁中,JavaScript又是一個很舉足輕重的指令碼。本文將介紹如何實現Java程式碼和Javascript程式碼的相互呼叫。 如何實現 實現Java和js互

ios開發-- URL Schemes 使用

用原生 iOS 的人分兩種,懂 URL Schemes 的和不懂的。 前者是「魔法師」,後者是「麻瓜」。 URL Schemes 應用在 iOS 上已經很久了。對於使用者來說,在沙盒機制下的 iOS 中,如果想做到一定程度上的自動化就不可避免地要用到 URL S

移動web開發畫素和DPR

前話:   畫素在web開發中幾乎天天用到,但到底什麼是畫素,移動端和桌面端的畫素有區別嗎,縮放對畫素有影響嗎,視網膜螢幕和畫素有什麼關係?關於這些問題,可能就不清楚了。本文將介紹關於畫素的相關知識    什麼是畫素:   畫素,又稱畫素,是影象顯示的基

iOS開發 -- CocoaPods安裝和使用步驟()

CocoaPods是什麼? 當你開發iOS應用時,會經常使用到很多第三方開源類庫,比如JSONKit,AFNetWorking等等。可能某個類庫又用到其他類庫,所以要使用 它,必須得另外下載其他類庫,而其他類庫又用到其他類庫,這也許是比較特殊的情況。總之意思就是,手動

Android 開發使用Eclipse Debug除錯

Ctrl+1 快速修復(最經典的快捷鍵,就不用多說了) Ctrl+D: 刪除當前行  Ctrl+Alt+↓ 複製當前行到下一行(複製增加) Ctrl+Alt+↑ 複製當前行到上一行(複製增加) Alt+↓ 當前行和下面一行互動位置(特別實用,可以省去先剪下,再貼上了) Alt+↑ 當前行和上面一行互動位置(同

IOS開發關於內購IAP/StoreKit

 Himi  原創, 歡迎轉載,轉載請在明顯處註明! 謝謝。 //——2012-12-11日更新   獲取"產品付費數量等於0這個問題"的原因 看到很多童鞋問到,為什麼每次都返回數量等於0?? 其實有童鞋已

Discuz!開發時間處理函式dgmdate()

使用過Discuz!的朋友都會知道Discuz!的時間可以顯示成多少秒前、多少分鐘前、幾個小時前、幾天前等等,而不是單純的顯示標準時間,這樣的時間顯示方式就更顯得人性化了! 那麼Discuz!是如何處理這個個性化時間顯示的呢,我們來看看Discuz!時間處理函式dgmdat

iOS開發中的UDID和UUID

      今天突然想和大家聊聊UDID和UUID的問題,雖然平時我們對這兩個東西很忽視,往往也很難區分這兩個東西。今天就來好好談談。【UDID】       UDID的全名為 Unique Device Identifier :裝置唯一識別符號。從名稱上也可以看出,UDID

Android中機制與RecyclerView的Item點選事件實現

總是看書上寫著回調回調,以為就是函式呼叫換了個名字,尤其是看了Button的點選事件實現後,覺得不就是觸發機制。 A事件發生->後臺處理邏輯->告訴前臺怎麼做->結束。 Android常見button點選事件: loginB