自定义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 写上如下代码

这样好了  允许效果如下:

posted on 2015-11-29 23:37  &#127774;Bob  阅读(183)  评论(0编辑  收藏  举报

导航