一句毫不夸张的话,同学们用tableView这个控件可能不亚于你使用label ,button这些控件,真的,用的太多了,那个项目中不是含有多个tableView啊?可是集合视图collectionView呢?说真的,我之前感觉根本就用不上这个控件,自己之前写过demo,但是项目中还真没用过,前不久一个需求用到了集合视图,真是有点书到用时方恨少啊,不会用。。。不会用没关系,摸索一下,看看它的API,看看它的官方文档,其实还真就这么回事,但是比tableView要复杂,相对来说也比较难,本人建议,可以用tableView的,别想着用collectionView。好了,切入正题:

1.遵守协议不同

表视图:UITableViewDelegate,UITableViewDataSource集合视图

集合视图:UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout

2.注册cell不同

表视图:可以选择性地注册,可以选择注册,也可以选择不注册,可以移步我另一篇博客,关于table的cell注册问题:tableViewCell详说registerNib: 与 registerClass: 的区别

集合视图:它是必须注册的,没有什么选择,如果非说有选择,那就是你选择用XIB来创建cell,还是纯代码来创建cell。两个方法:

[_mCollectionViewregisterClass:[YUCollectionViewCellclass] forCellWithReuseIdentifier:cellId];

 [_mCollectionViewregisterNib:[UINibnibWithNibName:NSStringFromClass([YUCollectionViewCellclass]) bundle:nil]forCellWithReuseIdentifier:cellId];



3.用途不同

表视图:主要是我们常见的布局,一行行的往下排列,就像表格一样,可以自定义每一行的样式(自定义cell)。

集合视图:主要是一些不规则的布局,一个view上,横竖都有多个控件,大小不一,可以用UICollectionViewDelegateFlowLayout 来帮忙处理。

探讨:

1.有同学可能会说,我现在的collectionView可以满足一切需要tableView的需求,换句话说 collectionView可以取代tableView。

这句话前半句不假,tableView能干的事 collectionView都可以干,但是苹果为什么没有废弃掉tableView呢?总归是有道理的,在我看来,collectionView能做tableView的事,可是当我们接到一个需求,一眼就感觉tableView做比较简单的时候,非要用collectionView来做是不是多此一举,还是那句话,collectionView比较麻烦,也没有tableView好用。我们在做项目的时候,还是表视图用的多。

2.有这么一个需求,横滑的view,里边是一张张图片,这个时候我们用什么做?

1.可以用tableView,这个横滑的,和竖滑的一样,无非就是方向变了,于是我这么做了:

在创建表视图的时候加上这么一句:

 _mTableView.transform =CGAffineTransformMakeRotation(-M_PI/2); 目的就是为了让table旋转过来。

在cell布局的时候加上这么一句:


cell.transform =CGAffineTransformMakeRotation(M_PI/2); 目的是cell也转过来

2.我可以用scrollView,上边画上一个个的view。

3.我可以用collectionView。

怎么做呢? 不说废话,上代码:

- (instancetype)initWithFrame:(CGRect)frame {
    if (self = [superinitWithFrame:frame]) {
        [selfaddSubview:self.mCollectionView];
    }
     return self;
}

- (UICollectionView *)mCollectionView {
     if (!_mCollectionView) {
       UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayoutalloc] init];
        flowLayout.scrollDirection =UICollectionViewScrollDirectionHorizontal;
      //   flowLayout.scrollDirection = UICollectionViewScrollDirectionHorizontal; //类似tableView的视图看横向item的个数
       _mCollectionView = [[UICollectionViewalloc] initWithFrame:CGRectMake(0,200, self.frame.size.width,cellHeight)collectionViewLayout:flowLayout];
       _mCollectionView.backgroundColor = [UIColorwhiteColor];
        [_mCollectionViewregisterClass:[YUCollectionViewCellclass] forCellWithReuseIdentifier:cellId];
       _mCollectionView.delegate =self;
       _mCollectionView.dataSource =self;
    }
     return _mCollectionView;
}

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
    return50;
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
     YUCollectionViewCell *cell = (YUCollectionViewCell *)[collectionViewdequeueReusableCellWithReuseIdentifier:cellIdforIndexPath:indexPath];
    cell.delegate =self;
    return cell;
}

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
     //每个item的大小
    returnCGSizeMake(200,50);
}

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"________%d",indexPath.row);
}

上边三种方法,我是极力推崇最后一种,横向滑动的任何需求都可以通过第三种方法来做,还简单明了,这可能就是collectionView的用武之地吧。

对了,还有一个点说一下:UICollectionView有两个属性:

@property (nonatomic) CGFloat minimumLineSpacing;
@property (nonatomic) CGFloat minimumInteritemSpacing;

这两个属性就是设置item之间的间隔的,有一点需要注意,

这两个属性都有一个默认值,都是10