每個collection view都必須有資料來源為其提供內容。它的責任是為collection views完成以下的事情:
控制collection view的section數目
每個section中的item的個數
為特定的資料項提供cell view
顯然,簡單的Recipe app,我們在前面的教程中包含了其中一個部分,在這裡我們將繼續講講collection view並且告訴你如何利用不同的section組織items,你將會學到怎樣為collection view新增header檢視和footer檢視。
如果你沒有看過前面的教程,建議你去看一看前面的教程,或者你可以到這裡下載here。
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_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:"方法來返回,每個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] objectAtIndex:indexPath.row]];
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];
每個collection view都必須有資料來源為其提供內容。它的責任是為collection views完成以下的事情:
控制collection view的section數目
每個section中的item的個數
為特定的資料項提供cell view
顯然,簡單的Recipe app,我們在前面的教程中包含了其中一個部分,在這裡我們將繼續講講collection view並且告訴你如何利用不同的section組織items,你將會學到怎樣為collection view新增header檢視和footer檢視。
如果你沒有看過前面的教程,建議你去看一看前面的教程,或者你可以到這裡下載here。
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_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:"方法來返回,每個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] objectAtIndex:indexPath.row]];
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];
}