IOS之UICollectionViewController ------------ 救赎之路

UICollectionViewColltroller是IOS中用来展示数据集的视图,功能强大,而且能实现的视觉丰富,这篇随笔笔者就演示下UICollectionViewConlltroller简单的使用,献给同样在编程之路前进的人。

首先来看看UIColletionViewController各种效果(素材来源百度)

UICollectionViewController 有三个非常重要的协议UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout

他们的作用分别是数据源,事件代理,视图布局。下面我讲在demo重一个个讲述这三个协议的用法。

开始

UICollectionViewDataSource三个重要方法1,numberOfSectionsInCollectionView。2,(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section 。3, (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section

一,新建项目,然后将默认新建的stroryboard跟View删除,配置项目设置Main interface为空,在AppDelegate添加代码

    UIWindow *window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen] bounds]];
    [window makeKeyAndVisible];
    self.window = window;

    UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc]init];
    YYHCollectionViewController *cc = [[YYHCollectionViewController alloc]initWithCollectionViewLayout:flowLayout];
    self.window.rootViewController = cc;

注意对于alloc UICollectionViewController 必须要给一个UIConllectionViewFlowLayout对象,否则会报错。

二,UICollectionViewControlelr虽然同UITableViewContrller都是同样用来展示数据,但是人性化却差的多。因为里面的Cell,HeadView,FootView都是没有默认控件,换句话来说就是所有的控件都是需要你自己来自定义。

UICollectionViewController自定义Cell跟HeadView,FootView跟UITableViewContrller大大有区别,但是你只需要记得一个方法initFrame:(CGRect )frame,你自定义的控件所有都要从这个获取。

新建一个Cell 继承UICollectionView然后进行必要的输出连接。

在.M文件中载initFrame函数

-(instancetype)initWithFrame:(CGRect)frame{
    if(self = [super initWithFrame:frame]){
        NSArray *array = [[NSBundle mainBundle] loadNibNamed:@"YYHCollectionViewCell" owner:self options:nil];
        if(array.count < 1)
            return nil;
        if(![[array firstObject] isKindOfClass:[UICollectionViewCell class]])
            return nil;
        self = [array firstObject];
    }
    return self;
}

目前为止自定义Cell已经完成。

三,展示数据

#pragma mark <UICollectionViewDataSource>
//返回Secion数量
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
    return self.radios.count;
}

//返回每个Section 下面的Cell数量
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
    RadioList *list = self.radios[section];
    return list.radios.count;
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    YYHCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath];
    RadioList *list = self.radios[indexPath.section];
    Radio *radio = list.radios[indexPath.row];
    cell.imageView.image = [UIImage imageNamed:radio.imgUrl];
    cell.descLabel.text = radio.fmName;

    return cell;
}

  成果如下:

结果与我们自定义的有所差别,我们理想状态下是一个UIImageView,一个UILabel。但是现在所展示却只有UIImageView。

寻找问题的所在需要靠自己,编程就是一个不断寻找问题,然后解决的问题。反复查找,我怀疑是Cell的frame问题,输出fram查看

    NSLog(@"%f",cell.frame.size.width);
    NSLog(@"%f",cell.frame.size.height);

2016-01-19 19:13:46.040 UICollectionViewControllerDemo[3260:90515] 50.000000
2016-01-19 19:13:46.041 UICollectionViewControllerDemo[3260:90515] 50.000000

发现与XIB大小不符合,得出结果Frame问题(xib.size = {75,90}

从这里我们引出UICollectionViewFlowLayout

UICollectionViewFlowLayout

//Cell大小
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath;

//Cell 空隙
- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section;

//Cell 之间的间隔
- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section;

//Secion之间的间隔
- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section;

//ReuseHeadView 大小
- (CGSize)collectionView:(UICollectionView *)collectionView layout:
(UICollectionViewLayout*)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section;

//ReuseFootHead大小
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForFooterInSection:(NSInteger)section;

  以上的方法都是用来布局UICollectionView。

这里我选择

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath;来解决我的Cell显示不完整的问题
-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{
    CGSize size = {75,90};
    return size;
}

  结果如期:

但是其实我们的是需要展示分组的情况, ,那么接着我们就实现分组的情况

四,实现分组。其实UICollectionViewController分组关键就是Section>1,事实上我们已经分组,其实UI没有合理显示,如果让它合理显示呢?那就是添加ReuseHeadView

新建文件继承UICollectionReuseView

同样需要在.M文件重载initFrame方法

-(instancetype)initWithFrame:(CGRect)frame{
    if(self = [super initWithFrame:frame])
    {
        NSArray *arrary = [[NSBundle mainBundle] loadNibNamed:@"RadioCollectionReusableView" owner:self options:nil];
        if(arrary.count < 1)
            return nil;
        if(![[arrary firstObject] isKindOfClass:[UICollectionReusableView class]])
            return nil;
        self = [arrary firstObject];
    }
    return self;
}

  到这里就完成了自定义HeadView

五,展示HeadView

添加代码

//实现HeadView
-(UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath{
    RadioCollectionReusableView *headView = [collectionView dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:reuseIdentifierForHeadView forIndexPath:indexPath];
    if([kind isKindOfClass:[UICollectionElementKindSectionHeader class]]){
        RadioList *list = self.radios[indexPath.section];
        headView.descLabel.text = list.name;
    }
    return headView;

}
//headView大小
-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section{
    CGSize currentSize = [[UIScreen mainScreen] bounds].size;
    CGSize headSize = {currentSize.width,45};
    return headSize;
}

结果展示:

补充:自定义的cell跟headView是需要向CollectionViewController注册

    [self.collectionView registerClass:[YYHCollectionViewCell class] forCellWithReuseIdentifier:reuseIdentifier];
    [self.collectionView registerClass:[RadioCollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:reuseIdentifierForHeadView];
    

UICollectionViewControllerDelegate,就简单描述下里面的方法的作用

//Cell是否应该高亮
- (BOOL)collectionView:(UICollectionView *)collectionView shouldHighlightItemAtIndexPath:(NSIndexPath *)indexPath;

//Cell是否可以被选中
- (BOOL)collectionView:(UICollectionView *)collectionView shouldSelectItemAtIndexPath:(NSIndexPath *)indexPath;
//Cell是否可以取消选中
- (BOOL)collectionView:(UICollectionView *)collectionView shouldDeselectItemAtIndexPath:(NSIndexPath *)indexPath;
//Cell选中时候调用
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath;
//Cell被取消选中调用
- (void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPath;

随便到这就结束了,不足之处还希望多多指教

附带Demo:http://download.csdn.net/detail/q13432502528/9410574

时间: 2024-10-16 16:36:12

IOS之UICollectionViewController ------------ 救赎之路的相关文章

【对比Android与IOS开发系列】——Activity与UIViewController

对比开发系列 --Activity与UIViewController Activity与UIViewController Android的Activity和Fragment是最基本的界面组成,而IOS是UIViewController.几乎所有的View和空间都会放在Activity和UIViewController中. 在之上有不少扩展的: Android: FragmentActivity, AppCompatActivity IOS: UITableViewController, UICo

【iOS-Android开发对照】 之 APP入口

[iOS-Android开发对照]之 APP入口 [图片 Android vs iOS] 提纲 对照分析iOS,Android的入口, iOS,Android的界面单元 为什么要有那样的生命周期 继承和抽象类怎么写,比如工厂模式 对象的强弱.iOS的特色 程序入口 (Entry Point) #首先来看iOS应用的入口: int main(int argc, char * argv[]) { @autoreleasepool { return UIApplicationMain(argc, ar

【iOS-Android开发对比】 之 APP入口

[iOS-Android开发对比]之 APP入口 [图片 Android vs iOS] 提纲 对比分析iOS,Android的入口, iOS,Android的界面单元 为什么要有那样的生命周期 继承和抽象类怎么写,例如工厂模式 对象的强弱,iOS的特色 程序入口 (Entry Point) #首先来看iOS应用的入口: int main(int argc, char * argv[]) { @autoreleasepool { return UIApplicationMain(argc, ar

iOS开发之窥探UICollectionViewController(三) --使用UICollectionView自定义瀑布流

上篇博客的实例是自带的UICollectionViewDelegateFlowLayout布局基础上来做的Demo, 详情请看<iOS开发之窥探UICollectionViewController(二) --详解CollectionView各种回调>.UICollectionView之所以强大,是因为其具有自定义功能,这一自定义就不得了啦,自由度非常大,定制的高,所以功能也是灰常强大的.本篇博客就不使用自带的流式布局了,我们要自定义一个瀑布流.自定义的瀑布流可以配置其参数: 每个Cell的边距

iOS开发之窥探UICollectionViewController(四) --一款功能强大的自定义瀑布流

在上一篇博客中<iOS开发之窥探UICollectionViewController(三) --使用UICollectionView自定义瀑布流>,自定义瀑布流的列数,Cell的外边距,Cell的最大以及最小高度是在我们的布局文件中是写死的,换句话说也就是不可配置的.为了循序渐进,由浅入深呢,上篇博客暂且那么写.不过那样写太过死板,本来使用起来比较灵活的自定义布局,如果把其配置参数给写死了,就相当于在笼中的猛兽,再厉害不也白扯蛮. 在今天这篇博客中我们要接着上篇博客中的Demo,使其自定义布局

iOS开发之窥探UICollectionViewController

iOS开发之窥探UICollectionViewController(一) -- Ready Your CollectionViewController 作者:青玉伏案 http://www.cnblogs.com/ludashi/p/4791826.html iOS开发之窥探UICollectionViewController(二) --详解CollectionView各种回调 作者:青玉伏案 http://www.cnblogs.com/ludashi/p/4792480.html iOS开

iOS开发之窥探UICollectionViewController(五) --一款炫酷的图片浏览组件

本篇博客应该算的上CollectionView的高级应用了,从iOS开发之窥探UICollectionViewController(一)到今天的(五),可谓是由浅入深的窥探了一下UICollectionView的用法,这些用法不仅包括SDK中自带的流式布局(UICollectionViewDelegateFlowLayout)而且介绍了如何根据你的需求去自定义属于你自己的CollectionView.自定义的CollectionView可谓是非常灵活,其灵活性也决定了其功能的强大.Collect

iOS彩票项目--第四天,新特性界面搭建,UICollectionViewController的初次使用

一.新特性界面搭建的思路: 在AppDelegate加载主窗体的时候进行判断程序版本号,直接进入程序或者进入新特性展示界面 取出当前的版本号,与旧的版本号相比较(旧的版本号在进入程序的时候存起来 =>建议偏好设置存储) 版本号不一样,说明当前版本是新版本需要进入新特性介绍,并将版本号存下来 1 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchO

iOS开发之UICollectionViewController

1.概述 UICollectionView控件主要是用来做九宫格的,类似于android中的GridView控件.其用法与UITableView一样,首先要使控制器遵守数据源协议,再将控制器设置为UICollectionView的数据源.同样,控制器遵守了UICollectionView的代理后也可以实现代理方法等. 2.常用的数据源方法 设置UICollectionViewController一共有多少组: - (NSInteger)numberOfSectionsInCollectionVi