我们很多时候使用UICollectionView 可能都是直接创建 UICollectionView 通过初始化的时候 传入一个布局对象的方式来使用UICollectionView
比如我们之前是这样写得:
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是只读的无法修改
这个时候 你可能会说 UICollectionViewController 里面不是有个collectionView 吗 ? 拿到collectionView 不就可以修改collectionView的布局了 吗? 当然不行了 因为我们现在时自定义了UICollectionViewController
我们在使用UICollectionViewController 控制器的 时候,也就是初始化的时候 就需要为UICollectionViewController 传入一个布局对象 不相信是吧 ! 下面给你演示下 :我们在viewDidLoad 里面修改collectionView的布局
这个时候一运行程序 你会发现报如下错误:
看到这里 你应该相信我说的了吧,也就是 必须在创建collectionViewColler的时候 传入布局对象,那么如何解决呢?
这个时候 就是考验我们对创建对象的理解了 ,我们知道 当我创建一个对象的时候 一般是使用这样的方式:
[[UICollectionViewController alloc] init]
上面的代码做了两件事:
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 写上如下代码
这样好了 允许效果如下: