怎样在UICollectionView中添加Header和footer
---恢复内容开始---
怎样在UICollectionView中添加Header和footer
转载于my.oschina/zboy/blog/221525
摘要来⾃-www.appcoda/supplementary-view-uicollectionview-flow-layout/
⽬录[-]
在前⾯我们已经学过,每个collection view都必须有数据源为其提供内容。它的责任是为collection views完成以下的事情:
控制collection view的section数⽬
每个section中的item的个数
为特定的数据项提供cell view
显然,简单的Recipe app,我们在前⾯的教程中包含了其中⼀个部分,在这⾥我们将继续讲讲collection view并且告诉你如何利⽤不同的section组织items,你将会学到怎样
为collection view添加header视图和footer视图。
如果你没有看过前⾯的教程,建议你去看⼀看前⾯的教程,或者你可以到这⾥下载。
Split Recipes into Two Sections in UICollectionView
在这个简单的程序中,RecipeCollectionViewController是集合视图的数据源对象,为了把视图分成两个部分,我们需要有⼀些变化,接下来我们完成:
起先,recipeImages数组是存储所有recipes的名称,因为我们想把recipes分成两组,我们要修改我们的代码,并使⽤签到数组来存储不同的recipe,也许你还不明⽩啥是
嵌⼊的数组,下⾯的图⽚会让你明⽩的。第⼀组包含主要的图像,⽽另⼀个为drink 和dessert。顶级数组(即recipeImages)包含两个数组,每个数组部分的特定区域包含特定
的data items。
让我们开始编写代码,在RecipeCollectionViewController.m中初始化"recipeImages"数组,并在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_no              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:"⽅法来返回,每个secions中的items数⽬:
- (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] w]];
cell.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"photo-frame-2.png"]];
return cell;
}
你可以和以前的代码⽐较以下,你就会知道只有⼀样是唯⼀的变化。我们⾸先检索该数组的section number然后从section中获取具体的items。
最后,怎样给collection view实现两个section,这个可以通过⽅法调⽤下⾯的⽅法来完成即:在RecipeCollectionViewController.m中的 numberOfSectionsInCollectionView
⽅法,在collectin View中返回section中的数量。
- (NSInteger)numberOfSectionsInCollectionVIew:(UICollectionView *)collectionView
{
return [recipeImages count];
}
现在运⾏你的app,你会在屏幕上看到下⾯的显⽰
Tweak the Margin of Your Content using Section Insets
(利⽤Section Insets)
程序是完成了,但是你是否觉得看起来并不怎么顺眼呢?图像的第⼀部分的最后⼀⾏和第⼆部分的第⼀样靠的太近。我们可以使⽤插⼊图到内容周围的空间中来改变⼀些格局,通过下图你可以⽐较直观的看
到影响:
你可以利⽤UIEdgeInsetsMake来完成插⼊:
insert = UIEdgeInsetsMake(top,left,botton,right);
在我们的Recipe app中我们只能在两个section之间添加空间。在RecipeCollectionViewController.m⽂件中的ViewDidLoad⽅法中,添加下⾯的⽅法:
UICollectionViewFlowLayout *collectionViewLayout = (UICollectionViewFlowLayout *)llectionViewFlowLayout;
collectionViewLayout.sectionInset = UIEdegeInsetsMake(20,0,0,0);
上⾯的代码实现了在collection view中创建和添加插⼊。现在我们运⾏程序,你将会看到下⾯的图像显⽰,我们在两个section之间增加了⼀些空间。
添加头部和底部视图
现在我们进⼀步调整应⽤程序,让其更酷。让我们来给应⽤程序添加头部和底部视图,我们利⽤UIColle
ctionViewFlowLayout来实现这⼀点。这⾥的header和footer视图可以被称为流布局的补充。在默认情况下,这些视图是在流布局中禁⽤的。但可以通过下⾯⼏件事情来配置 header和footer视图:
1. 为了尽量保持简单,所以我们可以选择storyboard来实现(当然这不是必须的,你同样可以使⽤代码来实现这⼀点)
2. 实现 UICollectionViewDataSource协议的 collectionView:viewForSupplementaryElementOfKind ⽅法,并通过这个⽅法来实现补充试图在collection view中显⽰。
在Storyboard中设计Header和Footer
⾸先并且添加到Xcode⼯程中。
到Storyboard中,选择collection view controller中的"Collection View"。在Attributes inspector中,选择"Section Header"和"Section Footer",⼀旦选中你就会在屏幕中看到下⾯的的显⽰:
在header和footer之间默认为空,我们会⽤storyboard来设计视图。header view是专门⽤来显⽰⼀个部分的标题,⽽底部视图只显⽰静态横幅图⽚。利⽤storyboard,从对象库中拖出image view并在其上⾯添加⼀个标签。设置字体颜⾊为⽩⾊,底部视图只需添加⼀个image view。如图:
选中footer view中的image view,在Attributes inspector中命名背景图⽚为"footer_banner.png"
最重要的是,我们必须为header和footer view指定⼀个标识符。这个标⽰符将会被⽤于代码识别图⽚名称。在Atteributes inspector中设置header view的identifier为“HeaderView”,同样的把footer view的identifier设置为“FooterView”。
为Header View添加新类
在默认情况下,header和footer view和UICollectionResuable类相关联。为了在header view中显⽰我们需要的背景和标题,我们必须创建⼀个新的继承⾃UICollectionResuableView的类,我们可以命名为 RecipeCollectionHeaderView。
在storyboard的Identifier inspector中的sustom class设置为“RecipeCollectionHeaderView”。按住Ctrl键,单机header中的image view,并拖向RecipeCollectionHeaderView.h中插⼊⼀个Outlet 变量。命名变量为"backgroundImage"。重复同样的步骤对UILabel实现,然后命名为"title"。
实现viewForSupplementaryElementOfKind⽅法
如果你尝试运⾏应⽤程序,你可能不会看到header和footer,这是因为我们还没有实现"viewFOrSupplementaryElementOfKind:"⽅法。选
择“RecipeCollectionViewController”,并添加import语句。
#import "RecipeCollectionHeaderView.h"
下⾯就是实现viewforSupplementaryElementOfKind⽅法的代码:
- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath
*)indexPath
{
UICollectionReusableView *reusableview = nil;
if (kind == UICollectionElementKindSectionHeader){php中header是什么意思
RecipeCollectionHeaderView *headerView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"HeaderView" forIndexPath:indexPath];
NSString *title = [[NSString alloc] initWithFormat:@"Recipe Group #%i",indexPath.section +1];
= 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;
}
上⾯的代码告诉它页眉/页脚视图应该在每个部分中使⽤collect view。我们⾸先确定该集合视图要求header或footer view。这可以通过使⽤⼀种变量来完成。对于头来看,我们出列header view(使⽤dequeueReusableSupplementaryViewOfKind :⽅法),并设置适当的标题和图像。正如你可以从两个if之间的代码,我们使⽤我们之前分配给获得header/footer view标识符。
现在运⾏代码,我们可以看到运⾏的结果:---恢复内容结束---

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。