自定义UICollectionViewController…

来源:互联网 发布:tensorflow训练mnist 编辑:程序博客网 时间:2024/06/05 02:18
我们很多时候使用UICollectionView 可能都是直接创建UICollectionView,通过初始化的时候传入一个布局对象的方式来使用UICollectionView

比如我们之前是这样写得:

UICollectionViewFlowLayout *layout =[[UICollectionViewFlowLayout alloc] init];
    
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 的布局方式

下面是我的做法:

 - (instancetype)init
  {
     //创建流水布局对象
     UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayoutalloc] init];
    layout.itemSize =  [UIScreenmainScreen].bounds.size;
     
    //设置水平滚动
    layout.scrollDirection =UICollectionViewScrollDirectionHorizontal;
     
    //   // 设置cell之间间距
    layout.minimumInteritemSpacing = 0;
     //   // 设置行距
    layout.minimumLineSpacing = 0;
    
     return[super initWithCollectionViewLayout:layout];
 }
这样我们一创建 UICollectionViewController 的时候默认就会由流水布局的样式了

另外附上在viewdidload里边注册cell的几种方法,仅供参考使用:
如果采用如下3种方式,为UICollectionViewController(UITableViewController)注册了原形Cell,系统会用注册的cell作为显示用的cell和可重用cell,一旦缓冲区中不存在可重用cell,系统会使用注册的原形Cell新实例化一个Cell供程序使用!
    因此只要注册了原形Cell,创建cell时就不再需要cell == nil的判断了。
    */

   //1.纯代码自定义的cell注册如下:
    [self.collectionViewregisterClass:[HMStatusCell class]forCellReuseIdentifier:ID];

    //2.使用Xib自定义的cell,注册如下
    [self.collectionView registerNib:[UINibnibWithNibName:@"WZUserCell" bundle:nil]forCellReuseIdentifier:UserCellId];
    
    //3.使用Storyboard创建ProtoCell,只需设置ProtoCell的reuseIdentifier,系统自动注册。
    

0 0
原创粉丝点击