怎樣在UICollectionView中添加Header和footer

轉(zhuǎn)載地址:http://my.oschina.net/zboy/blog/221525

在前面我們已經(jīng)學(xué)過宋彼,每個(gè)collection view都必須有數(shù)據(jù)源為其提供內(nèi)容。它的責(zé)任是為collection views完成以下的事情:

控制collection view的section數(shù)目

每個(gè)section中的item的個(gè)數(shù)

為特定的數(shù)據(jù)項(xiàng)提供cell view

? ? ? 顯然仙畦,簡(jiǎn)單的Recipe app宙暇,我們?cè)谇懊娴慕坛讨邪似渲幸粋€(gè)部分,在這里我們將繼續(xù)講講collection view并且告訴你如何利用不同的section組織items议泵,你將會(huì)學(xué)到怎樣為collection view添加header視圖和footer視圖占贫。

如果你沒有看過前面的教程,建議你去看一看前面的教程先口,或者你可以到這里下載here型奥。

?Split Recipes into Two Sections in UICollectionView

? ? ? 在這個(gè)簡(jiǎn)單的程序中,RecipeCollectionViewController是集合視圖的數(shù)據(jù)源對(duì)象碉京,為了把視圖分成兩個(gè)部分厢汹,我們需要有一些變化,接下來我們完成:

?????? 起先谐宙,recipeImages數(shù)組是存儲(chǔ)所有recipes的名稱烫葬,因?yàn)槲覀兿氚裷ecipes分成兩組,我們要修改我們的代碼,并使用簽到數(shù)組來存 儲(chǔ)不同的recipe搭综,也許你還不明白啥是嵌入的數(shù)組垢箕,下面的圖片會(huì)讓你明白的。第一組包含主要的圖像兑巾,而另一個(gè)為drink和dessert条获。頂級(jí)數(shù)組 (即recipeImages)包含兩個(gè)數(shù)組,每個(gè)數(shù)組部分的特定區(qū)域包含特定的data items蒋歌。

Nested Array Explained

? ? ? ? ? ?讓我們開始編寫代碼帅掘,在RecipeCollectionViewController.m中初始化"recipeImages"數(shù)組,并在viewDidload方法中寫下面的方法:

? ?? - (void)viewDidLoad? ? {

?????? [super viewDidLoad];

? ? ? ? //Initialize recipe image array

? ? ? ?? NSArray *mainDishImages = [NSArray arrryWithObjects:@"egg_benedict.jpg",?@"full_breakfast.jpg",?@"ham_and_cheese_panini.jpg",?@"ham_and_egg_sandwich.jpg",?@"hamburger.jpg",?@"instant_noodle_with_egg.jpg",?@"japanese_noodle_with_pork.jpg",?@"mushroom_risotto.jpg",?@"noodle_with_bbq_pork.jpg",?@"thai_shrimp_cake.jpg",?@"vegetable_curry.jpg",?nil];

? ? ? ?? NSArray *drinkDessertImages = [NSArray arrayWithObjects:@"angry_birds_cake.jpg",?@"creme_brelee.jpg",?@"green_tea.jpg",?@"starbucks_coffee.jpg",?@"white_chocolate_donut.jpg",?nil];

? ? ? recipeImages = [NSArray arrayWithObjects:mainDishImages,drinkDesserImages,nil];

? ? }

? ? ? ? ? 上面的代碼將recipes images分成兩組堂油。接下來修档,修改"numberOfIntemsInSecion:"方法來返回,每個(gè)secions中的items數(shù)目:

? ? ? ? - (NSInteger)collectionView:(UICollectionView*)collectionView numberOfItemsInSecion:(NSInteger)section

? ?{

? ? ? ? ? ? ?return [[recipeImages objectAtIndex:sectin]count];

? ?}

? ? ? ? ? ? ? 接下來我們按照下面的方法修改"cellForItemAtIndexPath:"方法

? ? ? ?- (UICollectionVIewCell *)collectionView:(UICollectionView*)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath

{

?????? static NSString *identifier = @"Cell";

? ? ? ? ? ? ? RecipeViewCell *cell = (RecipeViewCell *)[collectionView dequeueReuseIdentifier:identifier forIndexPath:indexPath];

? ? ? ? ? ? ?UIImageView *recipeImageView = (UIImageView *)[cell viewWithTag:100];

? ? ? ? ? ? ?recipeImageView.image = [UIImage imagedNamed:[recipeImages[indexPath.section] objectAtIndex:indexPath.row]];

? ? ? ? ? ? ?cell.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"photo-frame-2.png"]];

? ? ? ? ? ? ? ? ? return cell;

}

? ? ? ? 你可以和以前的代碼比較以下府框,你就會(huì)知道只有一樣是唯一的變化吱窝。我們首先檢索該數(shù)組的section number然后從section中獲取具體的items。

? ? ? ? ?最后寓免,怎樣給collection view實(shí)現(xiàn)兩個(gè)section,這個(gè)可以通過方法調(diào)用下面的方法來完成即:在RecipeCollectionViewController.m中的 numberOfSectionsInCollectionView方法,在collectin View中返回section中的數(shù)量计维。

? - (NSInteger)numberOfSectionsInCollectionVIew:(UICollectionView *)collectionView

{

? ? return [recipeImages count];

}

現(xiàn)在運(yùn)行你的app袜香,你會(huì)在屏幕上看到下面的顯示

Recipe App with Two Sections

Tweak the Margin of Your Content using Section Insets

?(利用Section Insets)

? ?程序是完成了,但是你是否覺得看起來并不怎么順眼呢鲫惶?圖像的第一部分的最后一行和第二部分的第一樣靠的太近蜈首。我們可以使用插入圖到內(nèi)容周圍的空間中來改變一些格局,通過下圖你可以比較直觀 的看到影響:

Add margin using section insets

? ? 你可以利用UIEdgeInsetsMake來完成插入:

? ? ? ? ? ? ? ?insert = UIEdgeInsetsMake(top,left,botton,right);

? ? 在我們的Recipe app中我們只能在兩個(gè)section之間添加空間欠母。在RecipeCollectionViewController.m文件中的ViewDidLoad方法中欢策,添加下面的方法:

? ? ? ? ? UICollectionViewFlowLayout *collectionViewLayout = (UICollectionViewFlowLayout *)self.collectionViewFlowLayout;

? ? ? ? ? collectionViewLayout.sectionInset = UIEdegeInsetsMake(20,0,0,0);

?上面的代碼實(shí)現(xiàn)了在collection view中創(chuàng)建和添加插入。現(xiàn)在我們運(yùn)行程序赏淌,你將會(huì)看到下面的 圖像顯示踩寇,我們?cè)趦蓚€(gè)section之間增加了一些空間。

? ? ??

Recipe Collection View with Insets


? ? ? 添加頭部和底部視圖

? ? ? ? ? ? ?現(xiàn)在我們進(jìn)一步調(diào)整應(yīng)用程序六水,讓其更酷俺孙。讓我們來給應(yīng)用程序添加頭部和底部視圖,我們利用UICollectionViewFlowLayout來實(shí)現(xiàn) 這一點(diǎn)。這里的header和footer視圖可以被稱為流布局的補(bǔ)充掷贾。在默認(rèn)情況下睛榄,這些視圖是在流布局中禁用的。但可以通過下面幾件事情來配置 header和footer視圖:

? 為了盡量保持簡(jiǎn)單想帅,所以我們可以選擇storyboard來實(shí)現(xiàn)(當(dāng)然這不是必須的场靴,你同樣可以使用代碼來實(shí)現(xiàn)這一點(diǎn))

實(shí)現(xiàn) UICollectionViewDataSource協(xié)議的 collectionView:viewForSupplementaryElementOfKind 方法,并通過這個(gè)方法來實(shí)現(xiàn)補(bǔ)充試圖在collection view中顯示。


? ? ? ?在Storyboard中設(shè)計(jì)Header和Footer

? ? ? ?首先download the header/footer background images并且添加到Xcode工程中旨剥。

? ? ? ? ?到Storyboard中咧欣,選擇collection view controller中的"Collection View"。在Attributes inspector中泞边,選擇"Section Header"和"Section Footer",一旦選中你就會(huì)在屏幕中看到下面的的顯示:

Storyboard Enables Section Header and Footer

? ? ? ?在header和footer之間默認(rèn)為空该押,我們會(huì)用storyboard來設(shè)計(jì)視圖。header view是專門用來顯示一個(gè)部分的標(biāo)題阵谚,而底部視圖只顯示靜態(tài)橫幅圖片蚕礼。利用storyboard,從對(duì)象庫(kù)中拖出image view并在其上面添加一個(gè)標(biāo)簽梢什。設(shè)置字體顏色為白色奠蹬,底部視圖只需添加一個(gè)image view。如圖:

Design header and footer views

? ?選中footer view中的image view嗡午,在Attributes inspector中命名背景圖片為"footer_banner.png"

Add Footer View Background

? ? ? ?最重要的是囤躁,我們必須為header和footer view指定一個(gè)標(biāo)識(shí)符。這個(gè)標(biāo)示符將會(huì)被用于代碼識(shí)別圖片名稱荔睹。在Atteributes inspector中設(shè)置header view的identifier為“HeaderView”,同樣的把footer view的identifier設(shè)置為“FooterView”狸演。

? ? ??

Collection Reusable View Header Identifier


為Header View添加新類

? ? 在默認(rèn)情況下,header和footer view和UICollectionResuable類相關(guān)聯(lián)僻他。為了在header view中顯示我們需要的背景和標(biāo)題宵距,我們必須創(chuàng)建一個(gè)新的繼承自UICollectionResuableView的類,我們可以命名為 RecipeCollectionHeaderView吨拗。

Add Collection Header View Class

? 在storyboard的Identifier inspector中的sustom class設(shè)置為“RecipeCollectionHeaderView”满哪。按住Ctrl鍵,單機(jī)header中的image view,并拖向RecipeCollectionHeaderView.h中插入一個(gè)Outlet 變量劝篷。命名變量為"backgroundImage"哨鸭。重復(fù)同樣的步驟對(duì)UILabel實(shí)現(xiàn),然后命名為"title"娇妓。

? ?

Establish connection with RecipeCollectionHeaderVeiw

? ? ?實(shí)現(xiàn)viewForSupplementaryElementOfKind方法

? ? ? ? ? ? 如果你嘗試運(yùn)行應(yīng)用程序像鸡,你可能不會(huì)看到header和footer,這是因?yàn)槲覀冞€沒有實(shí) 現(xiàn)"viewFOrSupplementaryElementOfKind:"方法哈恰。選擇 “RecipeCollectionViewController”,并添加import語(yǔ)句坟桅。

? ? ? ? ? ? ? #import "RecipeCollectionHeaderView.h"

?下面就是實(shí)現(xiàn)viewforSupplementaryElementOfKind方法的代碼:

? ? - (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath

{

? ? ? UICollectionReusableView *reusableview = nil;

? ? ?if (kind == UICollectionElementKindSectionHeader){

? ? ? ? ?RecipeCollectionHeaderView *headerView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"HeaderView" forIndexPath:indexPath];

? ? ? ? ?NSString *title = [[NSString alloc] initWithFormat:@"Recipe Group #%i",indexPath.section +1];

? ? ? ? ?headerView.title.text = title;

? ? ? ? ?UIImage *headerImage = [UIImage imageNamed:@"header_banner.png"];

? ? ? ? ?headerView.backgroundImage.image = headerImage;

? ? ? ? ?reusableView = headerView;

? }

? ? ? ? if (kind == UICollectionElementKindSectionFooter){

? ? UICollectionReusableView *footerview = [collectionView dequeueResuableSupplementaryViewOfKind:UICollectionElementKindSectionFooter withReuseIdentifier:@"FooterView" forIndexPath:indexPath];

? ? ? ?reusableview = footerview;

}

? ?return reusableview;

? ?

}

上 面的代碼告訴它頁(yè)眉/頁(yè)腳視圖應(yīng)該在每個(gè)部分中使用collect view。我們首先確定該集合視圖要求header或footer view蕊蝗。這可以通過使用一種變量來完成仅乓。對(duì)于頭來看,我們出列header view(使用dequeueReusableSupplementaryViewOfKind :方法)蓬戚,并設(shè)置適當(dāng)?shù)臉?biāo)題和圖像夸楣。正如你可以從兩個(gè)if之間的代碼,我們使用我們之前分配給獲得header/footer view標(biāo)識(shí)符。

?現(xiàn)在運(yùn)行代碼豫喧,我們可以看到運(yùn)行的結(jié)果:

? ?

Recipe App with Header and Footer

另附上CollectionView的簡(jiǎn)單實(shí)用:http://blog.csdn.net/Apple_app/article/details/38867123

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末石洗,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子紧显,更是在濱河造成了極大的恐慌讲衫,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件孵班,死亡現(xiàn)場(chǎng)離奇詭異涉兽,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)篙程,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門枷畏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人虱饿,你說我怎么就攤上這事拥诡。” “怎么了氮发?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵渴肉,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我爽冕,道長(zhǎng)仇祭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任扇售,我火速辦了婚禮前塔,結(jié)果婚禮上嚣艇,老公的妹妹穿的比我還像新娘承冰。我一直安慰自己,他們只是感情好食零,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布困乒。 她就那樣靜靜地躺著,像睡著了一般贰谣。 火紅的嫁衣襯著肌膚如雪娜搂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天吱抚,我揣著相機(jī)與錄音百宇,去河邊找鬼。 笑死秘豹,一個(gè)胖子當(dāng)著我的面吹牛携御,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼啄刹,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼涮坐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起誓军,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤袱讹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后昵时,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捷雕,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年债查,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了非区。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡盹廷,死狀恐怖征绸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情俄占,我是刑警寧澤管怠,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站缸榄,受9級(jí)特大地震影響渤弛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜甚带,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一她肯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鹰贵,春花似錦晴氨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至敷钾,卻和暖如春枝哄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背阻荒。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工挠锥, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人侨赡。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓蓖租,卻偏偏與公主長(zhǎng)得像纱控,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子菜秦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容