UIConllectionView和UITableView類似,也是展示數據,但不同於UITableView那種規則的佈局,UICollectionView可以實現不規則的佈局,即瀑布流。 創建UICollectionView UICollectionView *collectionView = [
UIConllectionView和UITableView類似,也是展示數據,但不同於UITableView那種規則的佈局,UICollectionView可以實現不規則的佈局,即瀑布流。
創建UICollectionView
UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:[[UIScreen mainScreen] bounds] collectionViewLayout:layout];
集合視圖的創建,必須要指定佈局,如果沒有佈局,顯示不了任何東西,即layout。
//創建一個佈局對象,採用系統佈局類UICollectinviewFlowLayout UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
因為是系統的佈局類,所以也是規則的,但可以自定義FlowLayout的,可以根據自己的需求,來創建不規則的網格。
可以對各個的佈局細節分別進行設置
//設置最小的行間距 layout.minimumLineSpacing = 20; //設置item與item之間的間距 layout.minimumInteritemSpacing = 10; //集合視圖的分區間隔 //四個值 上左下右 layout.sectionInset = UIEdgeInsetsMake(20, 10, 10, 10); //設置集合視圖的滑動方向 layout.scrollDirection = UICollectionViewScrollDirectionVertical;// 向下 layout.scrollDirection = UICollectionViewScrollDirectionHorizontal; // 向右 CGFloat totalWidth = self.view.frame.size.width; //設置每一個item的尺寸大小 // layout.itemSize = CGSizeMake((totalWidth - 40) / 3, 80);
當然,簽訂協議之後也可以通過方法進行設置
說到協議 ,協議 分為兩個部分,數據源協議UICollectionViewDelegateSource和代理協議UICollectionViewDelegate
因為涉及到佈局,也會簽訂的佈局協議UICollectionViewDelegateFlowLayout
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{ return CGSizeMake((kWidth - 40) / 3, 100); } - (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section{ return UIEdgeInsetsMake(0, 0, 0, 0); } - (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section{ return 20; } - (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section{ return 20; }
UICollectionViewDataSource和UITableView一樣,也有兩個必須要實現的方法
//顯示個數 - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{ return 50; } //每個cell顯示的內容 - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{ MyCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"reuse" forIndexPath:indexPath]; cell.contentView.backgroundColor = [UIColor colorWithRed:kColor green:kColor blue:kColor alpha:1.0]; cell.numberLabel.text = [NSString stringWithFormat:@"%ld",indexPath.row]; return cell; }
我這邊cell的顯示內容是顯示一個Label。自定義cell,來設置label的格式。
同UITableView一樣,每個item都可以點擊,觸發 方法
//item點擊之後觸發的方法 - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{ NSLog(@"分區數%ld, 行數%ld",indexPath.section, indexPath.row); }
值得註意的是,集合視圖不像表視圖那樣,集合視圖,如果想顯示內容,就必須註冊cell
//集合視圖如果想要顯示內容,就必須將cell進行註冊 [collectionView registerClass:[MyCollectionViewCell class] forCellWithReuseIdentifier:@"reuse"];
註意:
集合視圖的不規則佈局在日常使用還是比較頻繁的,因為每個空間佈局都不一定會是規則,也會有差別,通過自定義FlowLayout..來顯示不同的佈局