咱們不少時候使用UICollectionView 可能都是直接建立 UICollectionView 經過初始化的時候 傳入一個佈局對象的方式來使用UICollectionViewapp
好比咱們以前是這樣寫得:ide
1 UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; 2 3 UICollectionView *collection = [[UICollectionView alloc] initWithFrame:self.view.bounds collectionViewLayout:layout];
可是有時候這樣的方式 可能達不到咱們的需求 ,好比咱們想利用collectionView 建立一個app的新特性的引導界面 這個時候上面這種方式就不適用 這個時候 咱們就須要自定義UICollectionViewController佈局
可是這樣的畫 問題就來了 ,當咱們自定義了UICollectionViewController 就沒法設置 UICollectionView的佈局樣式了 ,由於 當咱們繼承了 UICollectionViewController 他內部的UICollectionViewLayout是隻讀的沒法修改ui
這個時候 你可能會說 UICollectionViewController 裏面不是有個collectionView 嗎 ? 拿到collectionView 不就能夠修改collectionView的佈局了 嗎? 固然不行了 由於咱們如今時自定義了UICollectionViewControlleratom
咱們在使用UICollectionViewController 控制器的 時候,也就是初始化的時候 就須要爲UICollectionViewController 傳入一個佈局對象 不相信是吧 ! 下面給你演示下 :咱們在viewDidLoad 裏面修改collectionView的佈局spa
這個時候一運行程序 你會發現報以下錯誤:code
看到這裏 你應該相信我說的了吧,也就是 必須在建立collectionViewColler的時候 傳入佈局對象,那麼如何解決呢?orm
這個時候 就是考驗咱們對建立對象的理解了 ,咱們知道 當我建立一個對象的時候 通常是使用這樣的方式: 對象
[[UICollectionViewController alloc] init]blog
上面的代碼作了兩件事:
1.在堆區爲UICollectionViewController開闢一塊內存空間
2.調用對象的init方法 作一些初始化的操做
講到這裏 聰明的你 必定知道怎麼作了, 沒錯 ,就是在 init方法 上面 作手腳 ,咱們能夠在init方法裏面設置UICollectionViewController 的佈局方式
下面是個人作法:
1 - (instancetype)init 2 { 3 //建立流水佈局對象 4 UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; 5 layout.itemSize = [UIScreen mainScreen].bounds.size; 6 7 //設置水平滾動 8 layout.scrollDirection = UICollectionViewScrollDirectionHorizontal; 9 10 // // 設置cell之間間距 11 layout.minimumInteritemSpacing = 0; 12 // // 設置行距 13 layout.minimumLineSpacing = 0; 14 15 return [super initWithCollectionViewLayout:layout]; 16 }
這樣咱們一建立 UICollectionViewController 的時候 默認就會由流水佈局的樣式了
其餘的一些設置,下面粘貼出我本身寫的所有代碼
下面是自定義SYCollectionViewController.m文件裏面的所有代碼
1 /** 2 下面是自定義SYCollectionViewController.m文件裏面的所有代碼 3 */ 4 5 #import "SYCollectionViewCell.h" 6 #import "SYCollectionViewController.h" 7 8 @interface SYCollectionViewController () 9 10 @end 11 12 @implementation SYCollectionViewController 13 14 - (instancetype)init 15 { 16 //建立流水佈局對象 17 UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; 18 layout.itemSize = [UIScreen mainScreen].bounds.size; 19 20 //設置水平滾動 21 layout.scrollDirection = UICollectionViewScrollDirectionHorizontal; 22 23 // // 設置cell之間間距 24 layout.minimumInteritemSpacing = 0; 25 // // 設置行距 26 layout.minimumLineSpacing = 0; 27 28 return [super initWithCollectionViewLayout:layout]; 29 } 30 31 static NSString *ID = @"cell"; 32 - (void)viewDidLoad 33 { 34 [super viewDidLoad]; 35 36 self.collectionView.pagingEnabled = YES; 37 38 //隱藏水平滾動條 39 self.collectionView.showsHorizontalScrollIndicator = NO; 40 41 //取消彈簧效果 42 self.collectionView.bounces = NO; 43 44 //註冊cell 45 [self.collectionView registerClass:[SYCollectionViewCell class] forCellWithReuseIdentifier:ID]; 46 47 } 48 49 50 /** 51 * 一共有多少組數據 52 */ 53 - (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView 54 { 55 return 1; 56 } 57 58 /** 59 * 每一組有多少條數據 60 */ 61 - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section 62 { 63 return 4; 64 } 65 66 /** 67 * 每個cell的顯示樣式 68 * 69 */ 70 - (UICollectionViewCell*)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 71 { 72 SYCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:ID forIndexPath:indexPath]; 73 74 cell.image = [UIImage imageNamed:[NSString stringWithFormat:@"guide%ldBackground",indexPath.item+1]]; 75 76 NSLog(@"%@",[NSString stringWithFormat:@"guide%ldBackground",indexPath.item+1]); 77 78 return cell; 79 } 80 @end
下面是自定義cell ,SYCollectionViewCell.h文件裏面的所有代碼
1 #import <UIKit/UIKit.h> 2 3 @interface SYCollectionViewCell : UICollectionViewCell 4 /**cell顯示的圖片**/ 5 @property(nonatomic,strong)UIImage *image; 6 @end
下面是自定義cell ,SYCollectionViewCell.m文件裏面的所有代碼
1 #import "SYCollectionViewCell.h" 2 3 @interface SYCollectionViewCell () 4 5 /**內部imageView控件**/ 6 @property(nonatomic,weak)UIImageView *imageView; 7 8 @end 9 10 @implementation SYCollectionViewCell 11 /** 12 * 重寫imageView的getter方法 在裏面作添加imageView到cell上面的操做 13 * 14 */ 15 - (UIImageView *)imageView 16 { 17 if (!_imageView) { 18 //建立一個新的UIImageView 對象 19 UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.bounds]; 20 21 //賦值給成員變量 22 _imageView = imageView; 23 24 //添加到cell中 25 [self.contentView addSubview:imageView]; 26 } 27 return _imageView; 28 } 29 30 /** 31 * 重寫setter方法 爲imageView賦值 32 * 33 */ 34 - (void)setImage:(UIImage *)image 35 { 36 _image = image; 37 //爲imageView賦值 38 self.imageView.image = image; 39 } 40 41 42 @end
如何使用了 ,爲了操做簡單 我就直接設置了窗口的根控制器爲UICollectionViewController 控制器 因此在AppDelegate 寫上以下代碼
這樣好了 容許效果以下: