转载

自定义UICollectionViewController之后 如何设置UICollectionView的布局方式

我们很多时候使用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 写上如下代码

这样好了  允许效果如下:

自定义UICollectionViewController之后 如何设置UICollectionView的布局方式

正文到此结束
Loading...