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-C12345678 | #pragma mark /** * 返回Section的個數 */-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView |
2、在UICollectionViewDataSource的回撥方法中,還有一個是返回每個Section中Cell的數量的方法,在這我們返回30個Cell, 如下程式碼所示:
Objective-C12345678 | /** * 返回每個Section中Cell的個數 */-(NSInteger)collectionView:(UICollectionView*)collectionView numberOfItemsInSection:(NSInteger)section{return30;} |
3、在UICollectionViewDataSource還有一個必須實現的方法, 就是選擇我們CollectionView中所使用的Cell, 在這裡我們所使用的Cell是在Storyboard上實現的,所以不需要在我們的程式碼中註冊Cell, 之間使用重用標示符就可以獲取Cell的物件,如下所示:
Objective-C123456789101112 | /** * 返回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-C123456789101112131415161718192021222324 | /** * 註冊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-C1234567891011121314151617181920 | /** * 設定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-C1234567891011121314 | #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-C123456789101112 | /** * 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-C1234567891011 | /** * 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-C1234567891011 | /** * 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-C1234567891011121314151617 | /** * 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 |